RestSharp似乎没有序列化/ deser我的具有DateTime字段的类

时间:2014-08-14 20:17:16

标签: c# datetime asp.net-web-api restsharp

我有一个模型,我在我的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;}

}

当我调试代码时,我发现以下情况:

  1. 我正确创建并初始化我的类,我可以看到VS显示的DateTime值:

    2014年8月14日(日,月,年)。

  2. 当我的restsharp客户端向我的web-api层发出请求时,我在web-api控制器中设置了一个断点,我可以看到datetime字段都是空的。

    01/01/0001 12:00:00 AM

  3. 我的保存操作失败,因为日期时间值不在sql server的可接受范围内。

  4. 由于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?

1 个答案:

答案 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;。通过POSTUsers控制器,这应该表示保存。