あなたの質問にはすでにfound a solutionがありますが、私はそれが期待どおりに動作しなかった理由を説明するのに狙いを定めると思いました。
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の日付が正しく認識されます。
デシリアライズされた日付からUTC時間を取得できませんか? –
解決策を見つけたhttp://stackoverflow.com/questions/12246254/asp-net-web-api-modelbinders –