我注意到,对于QueryString和Body之间的相同值,DateTime
对象的序列化方式不同。基础值仍然是相同的正确值,但是序列化的QueryString的DateTimeKind
为Local
,而主体为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
。
答案 0 :(得分:2)
很不幸,就是这样,看看这个答案-Passing UTC DateTime to Web API HttpGet Method results in local time
与如何区别查询字符串参数和消息正文(模型绑定与参数绑定)有关。
您将必须调用.ToUniversalTime()
或实现自己的模型绑定程序来解决此问题。
答案 1 :(得分:0)
在 API 模型中使用 DateTimeOffset 将避免不必要的时区转换。见answer to another question。