mvc项目通过Microsoft.Owin、ClaimsIdentity进行存储用户信息,包括cookie。有时候用户信息需要更新到ClaimsIdentity,这个时候就需要从新写cookie,如下代码:
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);
如果是通过ajax请求数据,并且重新更新用户信息,那也不会出现问题,在PC浏览器以及移动端浏览器都能成功,但是如果你把h5网站嵌入到别人开发的app里呢,就不一定会成功了。
跟别的公司有个项目合作,我方提供H5网站,要讲此网站嵌入到他方公司的app里,通过webView进行访问,经测试发现ajax请求一直报错误,排除发现问题,定位到AuthenticationManager.SignIn时就出错,注释掉就能正常返回请求数据。同时在微信、支付宝等app里测试,不会出错,只有在那个app才会出现这个问题,初步判断就是写cookie有问题。
同时咨询了对方,查看app内置的浏览器是什么核,发现是webkit内核,但是测试后的结果和这个无关,还不是内核原因。
继续排除错误,让同事写一个简单的app,嵌入H5网站地址,经测试也没有问题。
经过和同事的共同努力,最终还是解决了问题。
前端通过post进行ajax请求,获取数据:
$.ajax({
type: "post",
url: "api/user",
data: {id:"1"},
success: function(data){
alert("success") //成功
},
error: function (data, textStatus, jqXHR) {
alert("error") //失败
}
});
后端:Controller
public ActionResult User(string id)
{
var user=UserQuery.GetUser(id)
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity); //此处出现问题
return Json(user);
}
通过此方法请求并返回数据是正常的,不会出现问题。
解决办法:
public ActionResult User(string id)
{
var user=UserQuery.GetUser(id)
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity); //此处出现问题
string jsonData = Json.Default.Serialize(user);//封装的序列化方法
return Content(jsonData, "application/json", Encoding.UTF8);
//return Json(user);
}
换了一种方式返回数据,通过Content进行返回处理,应该是App里做了编码处理,导致的。