Ответ 1
Хотя вы уже нашли решение для своего вопроса, я подумал, что сделаю попытку объяснить, почему он не работает так, как вы ожидали.
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 в этом сценарии.