我有一个WebApi登录功能:
public HttpResponseMessage Login(MyUser user)
{
Repository r = new Repository();
user = r.Select<MyUser>(u => u.Login == user.Login && u.Password == user.Password).FirstOrDefault();
if (user == null)
{
// - No user found/wrong password, returning error
}
// - User found
MyIdentity m = new MyIdentity(user);
m.SignIn(); // - creates cookie, logins
return Request.CreateResponse<Response>(HttpStatusCode.OK, new Response(true, "User logged in.", user));
}
Response
类是我用来处理Ajax内容的通用响应,它可选择接受一个对象:
public class Response
{
public bool Status { get; set; }
public string Message { get; set; }
public object Data { get; set; }
}
每当我调用该函数时,我都会获得响应的预期JSON以及Internet Explorer,Edge,Opera和Chrome上附加的任何对象(如果有),但Firefox会抛出以下异常:
System.Runtime.Serialization.SerializationException:输入&#39; Serialization.Dog&#39;数据合同名称&#39; Dog:http://schemas.datacontract.org/2004/07/Serialization&#39;不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我最终得到的错误是500。
为什么这样做以及处理所有浏览器的正确方法是什么?
答案 0 :(得分:0)
在这种情况下,如果它在除了一个浏览器之外的所有浏览器中工作,那么很可能firefox正在请求中发送其他数据。具体说明需要将哪些数据传递给您的方法([FromBody])。
$.ajax({
url: "http://yoururl.com",
type: "POST",
data: JSON.stringify({login: "yourLogin", password: "yourPassword"}),
datatype: "json",
contentType: "application/json; charset=utf-8",
async: false
}).then(function (response) {
//check response
});
[HttpPost]
public IHttpActionResult Login([FromBody]MyUser user)
{
try
{
Repository r = new Repository();
user = r.Select<MyUser>(u => u.Login == user.Login && u.Password == user.Password).FirstOrDefault();
if (user == null)
{
// - No user found/wrong password, returning error
return Unauthorized();
}
// - User found
MyIdentity m = new MyIdentity(user);
m.SignIn(); // - creates cookie, logins
return Ok(new Response(true, "User logged in.", user));
}
catch
{
return InternalServerError();
}
}