WebApi和Firefox出现错误500

时间:2016-01-19 13:18:25

标签: c# firefox asp.net-web-api

我有一个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。

为什么这样做以及处理所有浏览器的正确方法是什么?

1 个答案:

答案 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();
    }
}