我有一个模型,我在我的web-api层和我的基于restsharp的客户端使用。
它有日期时间字段,如:
public class User
{
public int Id {get;set;}
public string Name {get;set;}
public DateTime Created {get;set;}
public DateTime Updated {get;set;}
}
当我调试代码时,我发现以下情况:
我正确创建并初始化我的类,我可以看到VS显示的DateTime值:
2014年8月14日(日,月,年)。
当我的restsharp客户端向我的web-api层发出请求时,我在web-api控制器中设置了一个断点,我可以看到datetime字段都是空的。
01/01/0001 12:00:00 AM
我的保存操作失败,因为日期时间值不在sql server的可接受范围内。
由于DateTime是内置类型,因此应该可以正常工作。我做错了什么?
如果我在保存到DateTime.Now
之前重置日期时间字段,则会正确保存。
更新
我的Restsharp客户端代码具有以下方法:
public Token SaveUser(User user)
{
var request = new RestRequest();
request.Resource = "Users/SaveUser";
request.Method = Method.POST;
request.AddObject(user);
return Execute<User>(request);
}
当我在SaveUser中设置断点时,我可以看到日期时间值是正确的。
我的web-api控制器中的断点显示了具有空日期时间值的用户对象。
[HttpPost]
[Route("SaveUser")]
public SaveUserResponse SaveUser(User user)
{
....
}
的Fiddler
使用fiddler我的请求(使用AddObject)如下所示:
POST http://localhost:60525/api/Users/SaveUser HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp/104.4.0.0
Content-Type: application/x-www-form-urlencoded
Host: localhost:60528
Content-Length: 292
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Id=0&Name=abc&Created=15%2F08%2F2014%2011%3A58%3A14%20AM&Updated=15%2F08%2F2014%2011%3A58%3A14%20AM
为什么日期会在web-api端返回null?
答案 0 :(得分:1)
请考虑使用request.AddBody
代替request.AddObject
。
AddObject
将对象的每个属性添加为单独的参数。正文的编码方式类似于HTML <Form>
提交的工作方式。
AddBody
将对象内容序列化为请求正文。
您可能还希望使用request.RequestFormat = DataFormat.Json;
明确说明要发送的格式。
您的WebAPI控制器上可能还需要[FromBody]
属性:
public SaveUserResponse SaveUser([FromBody] User user)
作为一个旁边 - 它会更多&#34; RESTful&#34;命名您的控制器路线&#34;用户&#34;而不是&#34; SaveUser&#34;。通过POST
到Users
控制器,这应该表示保存。