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

时间:2019-05-13 13:08:05

标签: c# asp.net-core

我注意到,对于QueryString和Body之间的相同值,DateTime对象的序列化方式不同。基础值仍然是相同的正确值,但是序列化的QueryString的DateTimeKindLocal,而主体为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);
}

请求

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"

响应

{
    "queryDateKind": "Local",
    "bodyDateKind": "Utc"
}

有人知道为什么会这样吗?也许有一种设置可以始终序列化为相同的DateTimeKind吗?

最好不要在任何地方使用ToUniversalTime()ToLocalTime(),也不要使用任何自定义的IModelBinder

2 个答案:

答案 0 :(得分:2)

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

与如何区别查询字符串参数和消息正文(模型绑定与参数绑定)有关。

您将必须调用.ToUniversalTime()或实现自己的模型绑定程序来解决此问题。

答案 1 :(得分:0)

在 API 模型中使用 DateTimeOffset 将避免不必要的时区转换。见answer to another question