我是Web API的新手,我遇到了以下类的反序列化问题:
public class User
{
public virtual int ID { get; set; }
public virtual string Username { get; set; }
public virtual string Firstname { get; set; }
public virtual string Lastname { get; set; }
public virtual byte[] RowVersion { get; set; }
}
当我的UserController将对象序列化为JSON并将其发回时,它在Fiddler中看起来像这样:
{Username: "Foo", Firstname: Foo, Lastname: Bar, RowVersion: "AAAAAAAAJxc=", Id: 8}
当客户端发送PUT时,Fiddler中的RowVersion是相同的,但在我的UserController的Put-method中是错误的。对象的RowVersion属性只有1个条目字节1 = 0而不是byte [8]。
实际上,在不同的RowVersion中,如果我尝试更新对象(DBConcurrencyException),实体框架会抛出异常。
因此,当Web API反序列化传入的JSON以创建对象时,必定会出现错误...我在哪里可以解决我的问题?
提前谢谢!
修改解决方案:
我找到了解决方案:
而不是
public IHttpActionResult Put(User usr)
{
return Ok();
}
我已将其更改为:
public IHttpActionResult Put([FromBody]JToken jsonbody)
{
var usr = JsonConvert.DeserializeObject<User>(jsonbody.Root.ToString());
return Ok();
}
现在byte [](RowVersion)是正确的。我不知道它为什么会这样运作,但这也可以帮助人们。