13

日付プロパティを持つjsonオブジェクトをApiControllerに投稿すると、日付に逆シリアル化されません。

サーバー サイト コード:

public class MegaTestController : ApiController
{
    // POST /megatest
    public void Post(ttt value)
    {
        string sdf = "!sad";
    }
}

public class ttt
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
}

次に、フィドラーで POST リクエストを行います

POST http://localhost:62990/MegaTest HTTP/1.1

ユーザーエージェント: Fiddler

ホスト: ローカルホスト:62990

コンテンツ タイプ: テキスト/json

コンテンツの長さ: 54

{ "日付":"/日付(1239018869048)/", "名前":"おい" }

しかし、入ってくるオブジェクトにはNameプロパティ セットしかなく、Dateプロパティは {01.01.0001 00:00:00} です。

ヘッダーやプロジェクト設定が不足していませんか?


編集:リクエストは実際にはHttpClient. でリクエストを送信する前に日付をフォーマットすることは可能HttpClientですか?

public Task<T> Create<T>(T item)
{
    var service = new HttpClient();
    service.BaseAddress = new Uri("http://localhost:62990");

    var method = typeof(T).Name + "s"; // in this case it will be ttts

    var req = new HttpRequestMessage<T>(item);
    req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

    return service.PostAsync(method, req.Content).ContinueWith((reslutTask) =>
    {
        return reslutTask.Result.Content.ReadAsAsync<T>();
    }).Unwrap();
}

var data = new ttt { Name = "Dude", Date = DateTime.Now };
Create(data);

編集:これは ASP MVC 4 ベータ版の既知のバグであり、ASP MVC 4 の最終バージョンでは、デフォルトの XML シリアライザーを使用するか、 Json.netのデフォルトの Json シリアライザーを切り替えるまで、json シリアライザーとしてJson.netを使用します。 . 詳細については、hanselman ブログをご覧ください。

4

4 に答える 4

17

日付/時刻を「yyyy-MM-dd HH:mm:ss」として投稿してみてください。ASP MVC はそれを適切に処理します。

于 2012-02-23T16:44:43.747 に答える
9

Web API は、URL エンコードされた POST データの古い ASP.NET AJAX 形式の日付を受け入れないようです。現在、URL エンコードされた日付を受け入れる 2 つの形式があるようです。

ShortDateString: "2012 年 2 月 23 日"

ISO: "2012-02-23T00:00:00"

後者は ISO DateTime 形式であり、JavaScript の Date オブジェクトをその形式に変換するのに役立つさまざまなコード スニペットがあります。ここで言及されているいくつか: JavaScript で ISO 8601 形式の文字列を出力するにはどうすればよいですか?

ただし、そのデータを JSON として送信し、Content-Type を正しく設定した場合、 Web API/Date()/ 形式を引き続き受け入れます。

$.ajax({
  url: 'MegaTest',
  type: 'POST',
  // Setting this Content-Type and sending the data as a JSON string
  //  is what makes the old /Date()/ format work.
  contentType: 'application/json',
  data: '{ "Date":"/Date(1239018869048)/", "Name":"Dude" }'
});
于 2012-02-23T17:23:38.017 に答える
4

これは ASP MVC 4 ベータ版の既知のバグであり、ASP MVC 4 の最終バージョンでは、Json.netを json シリアライザーとして使用します。それまでは、デフォルトの XML シリアライザーを使用するか、デフォルトの Json シリアライザーを Json.net に切り替えることができます。詳細については、hanselman ブログをご覧ください。

DateTimeデフォルトの XML シリアライザーを使用して HttpClientで送信する小さな例を次に示します。

var service = new HttpClient();
service.BaseAddress = url;

var mediaType = new MediaTypeHeaderValue("application/xml");
XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter();
var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[] { formater });

service.PutAsync(method, req.Content);

ただし、json を使用したい場合は、ASP.NET Web API での JSON.NET の使用に関するブログ記事をご覧ください。

于 2012-03-05T12:13:58.363 に答える
1

ASP.Net Web API は、のDataContractJsonSerializerシリアル化に関連するバグがある を使用しますDateTime。代わりに JSON.Net を使用し、DataContractJsonSerializer の代わりに JSON.Net を使用する を実装する必要がありますMediaTypeFormatterここで同様の質問に対する私の回答を確認してください。

于 2012-02-28T00:13:28.710 に答える