尽管您已经为您的问题找到了解决方案,但我想我会尝试解释为什么它没有按您的预期工作。
WebApi 使用内容类型协商来确定读取数据时使用的解析器。这意味着它将查看Content-Type
请求的标头以做出决定。如果Content-Type
标头设置为,application/json
那么它将使用 Json.Net 解析内容并将其提供给您的方法。
HTTP GET 请求(例如您在此处发出的请求)没有设置内容类型。在这种情况下,“内容”实际上只是来自 URL 的查询字符串。WebApi 不希望在这里找到 JSON 数据,因此它不会尝试使用 JSON 解析器来理解它。即使是这样,您传递给 GetAll 方法的字符串也不是有效的 JSON。(它需要被引用才能有效。)
现在,如果您要更改方法以接受 POST 请求,并将内容类型标头设置为application/json
并将日期作为 JSON 字符串传递到正文中,那么 WebApi 将使用 Json.Net 对其进行解析,并且它将起作用如你所料。
例如,假设您的方法如下所示:
[HttpPost]
public object GetAll([FromBody]DateTime startDate)
{
try
{
return new
{
StartDate = startDate.ToString("yyyy-MM-dd HH:mm:ss"),
StartDateKind = startDate.Kind.ToString(),
};
}
catch (Exception ex)
{
return ex.Message;
}
}
你提出了这样的请求(注意 POST):
POST http://localhost:57524/api/values/GetAll HTTP/1.1
Content-Type: application/json
Content-Length: 22
Host: localhost:57524
"1994-11-05T17:15:30Z"
响应如下所示:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 31 May 2013 01:25:48 GMT
Content-Length: 57
{"StartDate":"1994-11-05 17:15:30","StartDateKind":"Utc"}
如您所见,在这种情况下,它确实正确地将日期识别为 UTC。