2

log4javascript を使用して、クライアント側のログ インフラストラクチャを作成したいと考えています。すべてのログがサーバーに送信されます。その部分はうまく機能します。これらのログメッセージをサーバーに書き込む WebApi コントローラーを作成しました。リクエストは次のとおりです。

リクエスト ヘッダー

次のビュー モデルを作成しました。

 public class LogEntryViewModel
{
    public string logger { get; set; }
    public int timestamp { get; set; }
    public string level { get; set; }
    public string url { get; set; }
    public string[] message { get; set; }
}

public class LoggerViewModel
{
  public LogEntryViewModel data { get; set; }
  public string layout { get; set; }
}

しかし問題は、すべてのデータLogEntryViewModelがデフォルトであることです。その結果に変更public LogEntryViewModel datapublic JObject dataても、空のdataオブジェクトになります。リクエストに含まれるJsonを解析しようとしましたが、正しいです。ここで何が問題になる可能性がありますか?

編集:

変更Content-Typeするとapplication/json;charset=UTF-8、リクエストは次のようになります。

リクエスト #2

そして、コントローラーの Post メソッドを変更しました。

// POST api/loggerservice
    public void Post([FromBody]LogEntryViewModel log)
    {
        //BL
    }

ただし、効果は同じです。

4

1 に答える 1

3

Web API では、メディア タイプによって、Web API が HTTP メッセージ本文をシリアル化および逆シリアル化する方法が決まります。XML、JSON、および form-urlencoded データの組み込みサポートがあり、メディア フォーマッタを作成することで追加のメディア タイプをサポートできます。

あなたのコンテンツタイプ (x-www-form-urlencoded) に基づいて、Web Api は次のようなものを期待していると思います:logger=AjaxLogger&timestamp=1375705087456...したがって、フォーム urlencoded データにシリアライザーを使用できます。

JSONをサーバーに送信しているので、モデルバインディングにJSONシリアライザーを使用できるように、Content-Typeapplication/jsonに設定して使用することをお勧めします。JSON.stringify

data: JSON.stringify({'logger':'AjaxLogger', 'timestamp': '1234568789'})

ここで、レイアウト プロパティも削除することをお勧めします。

は必要ありません[FromBody]。このブログ投稿[FromBody]は、属性を理解するのに役立ちました

于 2013-08-05T12:49:46.873 に答える