QueryString与主体中的ASP.NET DateTime序列化

JvR*_*JvR 5 c# asp.net-core

我注意到,DateTime对于QueryString和Body之间的相同值,对象的序列化方式不同。基础值仍然是相同的正确值,但是序列化的QueryString具有DateTimeKindof Local,而Body是Utc

终点

[HttpPost]
public ActionResult Post([FromQuery] DateTime queryDate, [FromBody] DateTime bodyDate)
{
  var result = new
  {
    queryDateKind = queryDate.Kind.ToString(),
    bodyDateKind = bodyDate.Kind.ToString()
  };

  return new ObjectResult(result);
}
Run Code Online (Sandbox Code Playgroud)

请求

POST /api/values?queryDate=2019-05-12T00%3A00%3A00.000Z HTTP/1.1
Host: localhost:5000
Content-Type: application/json
cache-control: no-cache
"2019-05-12T00:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)

响应

{
    "queryDateKind": "Local",
    "bodyDateKind": "Utc"
}
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?是否有可能始终序列化为相同的设置DateTimeKind

最好我不想使用ToUniversalTime()ToLocalTime()无处不在,也没有使用任何自定义IModelBinder

Jan*_*aar 4

不幸的是,事情就是这样,看看这个答案 - Passing UTC DateTime to Web API HttpGet Method results in local time

它与如何不同地处理查询字符串参数和消息正文、模型绑定与参数绑定有关。

您必须调用.ToUniversalTime()或实现您自己的模型绑定器才能解决此问题。

  • @haim770 该设置只会影响消息正文中的模型绑定。它对参数绑定没有影响。但是,是的,如果他总是想要当地时间,那么就可以了。 (2认同)