2013-08-22 19 views
16

Web APIプロジェクトのHTTP応答ヘッダーを記録しようとしています。DelegatingHandlerの応答ヘッダーがありません

public class LoggingHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     // Execute the request 
     return base.SendAsync(request, cancellationToken).ContinueWith(task => 
     { 
      var response = task.Result; 
      return response; 
     }); 
    } 
} 

しかし、問題は私ができる、次のとおりです。

プロジェクトは、私はこのようなDelegatingHandlerサブクラスが書いてきたVS2012、.NET 4.5およびASP.NET MVC 4

によって開発されましたresponseからヘッダーの値を取得しません。 response.Headersは空のコレクションで、という名前のキーだけを含むresponse.Content.Headersがあり、HttpContext.Currentnullです。

WebAPIContribのコードでは、同じロジックを使用してヘッダーを記録していますが、そのコードは動作していないようです。

Web APIプロジェクトでHTTP応答ヘッダーをどのようにトレースする必要がありますか?

+0

ここに同じ問題があります。解決策はありますか? – erwineberhard

+0

いいえ、決して見つからなかった –

+0

私は、委任ハンドラの応答メッセージを変更する代わりに、応答ヘッダをクライアントに送信することでこの問題を解決しました。私のjavascriptフレームワークでもかなり簡単です! – erwineberhard

答えて

0

あなたは正しい場所を見なければならない:Content-Type: application/jsonリクエストヘッダがありますと仮定

request.Content.Headers.ContentType 

、その後、前述の"application/json"を返します。

したがって、基本的にいくつかのヘッダーはコンテンツに関連付けられているので、そこから読むべきです。

同じことが応答ヘッダーに当てはまります。自分のタイプに応じて

response.Content.Headers.ContentType 
+0

**リクエスト**ヘッダを取得できませんか? ContentTypeだけでなくresponse.Headersが空であるすべての応答ヘッダーをログに記録する必要があります – Giorgi

+0

同じこと: 'response.Content.Headers' –

+0

response.Content.HeadersにはContentTypeのみが含まれています。他のヘッダー(コンテンツの長さ、キャッシュなど)はiis expressによって追加されているので、取得する方法はありませんか? – Giorgi

1

(体を返す要求に対して)応答内容からそれらを抽出するために必要な場合があります以下のコードを試してみてください。

return base.SendAsync(request, cancellationToken).ContinueWith(
         task => 
         { 

          var headers = task.Result.ToString(); 
          var body = task.Result.Content.ReadAsStringAsync().Result; 

          // RETURN THE ORIGINAL RESULT 
          var response = task.Result; 
          return response; 
         } 
      ); 
3

メッセージハンドラは、それらが MessageHandlersコレクションに表示されていることと同じ順序で呼び出されます。それらはネストされているので、応答 メッセージは反対方向に移動します。つまり、最後のハンドラは、応答メッセージを最初に取得するのは です。

ログハンドラがパイプラインの早期に登録されていることを確認してください。好ましくは最初に。

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     config.MessageHandlers.Add(new LoggingHandler(...)); 

     //...add other handlers 
     config.MessageHandlers.Add(new MessageHandler1()); 
     config.MessageHandlers.Add(new MessageHandler2()); 

     // Other code not shown... 
    } 
} 

このようにして、他のハンドラは応答を生成し、その情報を記録することができます。

async/await構文を使用してクラスを単純化して、応答クリーナーにアクセスすることもできます。

public class LoggingHandler : DelegatingHandler { 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { 

     //...Extract and log request 
     LogRequest(request); 

     // Send the request on to the inner handler(s) and get the response 
     var response = await base.SendAsync(request, cancellationToken); 

     //...Extract details from response for logging 
     LogResponse(response); 

     return response; 
    } 

    private void LogRequest(HttpRequestMessage request) { 
     //... code removed for brevity 
    } 

    private void LogResponse(HttpResponseMessage response) { 
     //... code removed for brevity 
    } 
} 

返信前に必要な詳細にアクセスできるようにする必要があります。

参照:HTTP Message Handlers in ASP.NET Web API

関連する問題