Web API未收到序列化对象的json

神奇的卡普里

客户端代码:

        public async Task<ActionResult> Login(UserLoginModel user)
    {
        UserModel data = new UserModel
        {
            Username = user.Username,
            Password = user.Password.GenerateHash()
        };

        var serializedData = JsonConvert.SerializeObject(data);

        var url = "http://localhost:55042/api/Login";

        var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        httpWebRequest.Accept = "application/json";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(serializedData);
            streamWriter.Flush();
            streamWriter.Close();
        }

        bool deserializedResult = false;
        using (var response = httpWebRequest.GetResponse() as HttpWebResponse)
        {
            if (httpWebRequest.HaveResponse && response != null) {
                using (var streamReader = new StreamReader(response.GetResponseStream())) {
                    var result = streamReader.ReadToEnd();
                    deserializedResult = JsonConvert.DeserializeObject<bool>(result);
                }
            }
        }

        return deserializedResult ? View() : throw new NotImplementedException();
    }

Web API:

    [HttpPost]
    [Route("api/Login")]
    public IHttpActionResult ValidateLogin([FromBody]UserModel user)
    {
        var result = _service.FetchUser(user);

        return Json(result);
    }

用户模型

[Serializable]
public class UserModel
{
    public int? ID { get; set; }

    public string Username { get; set; }

    public string Password { get; set; }

    public string Firstname { get; set; }

    public string Lastname { get; set; }

    public string Email { get; set; }

    public string NumberI { get; set; }

    public string NumberII { get; set; }

    public DateTime? CreateDate { get; set; }
}

即使我通过邮递员传递参数,也没有数据到达ValidateLogin。

我进行了很多搜索,根本没有找到解决方案,尝试了所有代码片段,理解了它们然后又回来了,依此类推,我被困住了,怎么了?

亚力山大

解决方案1

只需[Serializable]从中删除属性UserModel,一切都将正常工作。

解决方案2

当客户端使用JSON序列化行为序列化数据,Web API

var serializedData = JsonConvert.SerializeObject(data, new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        IgnoreSerializableAttribute = false
    }
});

现在Web API将正确反序列化通过的模型。

发生这种情况是因为从某些版本开始Json.NET考虑对象是否标记为Serializable默认情况下,没有该属性的情况下,所有公共成员(属性和字段)都会被序列化。以下类的序列化

public class UserModel
{
    public string Username { get; set; }

    public string Password { get; set; }
}

给出以下结果

{
  "Username": "name",
  "Password": "pass"
}

但是当通过[Serializable]属性标记类并且IgnoreSerializableAttribute设置为false所有私有字段和公共字段时,结果如下

{
  "<Username>k__BackingField": "name",
  "<Password>k__BackingField": "pass"
}

默认情况下,序列化程序会忽略[Serializable]属性,但会将中Web APIIgnoreSerializableAttribute设置为false因此,现在很容易看到为什么服务器无法在您的情况下正确反序列化给定模型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章