2013-08-22 50 views
16

Tôi đang cố ghi nhật ký tiêu đề phản hồi HTTP của dự án API Web của tôi.Không có tiêu đề phản hồi trong DelegatingHandler

Dự án được phát triển bởi VS2012, .NET 4.5 và ASP.NET MVC 4.

Tôi đã viết một lớp con DelegatingHandler như thế này:

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; 
     }); 
    } 
} 

Tuy nhiên, vấn đề là, tôi có thể không nhận được các giá trị tiêu đề từ response. response.Headers là bộ sưu tập trống, response.Content.Headers không chứa gì ngoài khóa có tên Content-TypeHttpContext.Currentnull.

Tôi đã xem mã số WebAPIContrib sử dụng cùng một logic để ghi nhật ký tiêu đề, nhưng mã của chúng dường như không hoạt động.

Vậy làm cách nào để theo dõi các tiêu đề phản hồi HTTP trong dự án API Web?

+0

Cùng một vấn đề ở đây. Bạn đã có một giải pháp? – erwineberhard

+0

Không, không bao giờ phát hiện ra rằng –

+0

Tôi đã giải quyết vấn đề bằng cách gửi tiêu đề phản hồi cho khách hàng thay vì thay đổi thông báo phản hồi trong trình xử lý ủy nhiệm. Dễ dàng hơn nhiều trong khung javascript của tôi! – erwineberhard

Trả lời

0

Bạn phải nhìn vào đúng nơi:

request.Content.Headers.ContentType 

Giả sử có một tiêu đề Content-Type: application/json yêu cầu, sau đó nói trên sẽ trở lại "application/json".

Vì vậy, về cơ bản một số tiêu đề được liên kết với Nội dung và đó là nơi bạn nên đọc chúng.

Tương tự đối với tiêu đề phản hồi. Tùy thuộc vào loại của chúng, bạn có thể cần trích xuất chúng từ nội dung phản hồi (đối với các yêu cầu trả lại nội dung)

response.Content.Headers.ContentType 
+0

Sẽ không có tiêu đề ** request **? Tôi cần phải đăng nhập tất cả các tiêu đề phản hồi, không chỉ ContentType mà còn đáp ứng. Người kiểm tra trống rỗng – Giorgi

+0

Điều tương tự: 'response.Content.Headers' –

+0

response.Content.Headers chỉ chứa ContentType. Các tiêu đề khác (độ dài nội dung, bộ nhớ cache, v.v ...) có được thêm bởi iis express và do đó không có cách nào để lấy chúng? – Giorgi

1

Hãy thử mã bên dưới.

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

xử lý tin nhắn được gọi theo thứ tự mà chúng xuất hiện trong MessageHandlers bộ sưu tập. Vì chúng được lồng nhau, phản hồi tin nhắn di chuyển theo một hướng khác. Nghĩa là, người xử lý cuối cùng là người đầu tiên nhận được thông báo phản hồi.

Đảm bảo rằng trình xử lý ghi nhật ký được đăng ký sớm trong đường ống. Tốt nhất là trước.

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... 
    } 
} 

Bằng cách đó, mọi trình xử lý khác sẽ có cơ hội điền phản hồi và thông tin đó được ghi lại.

Bạn cũng có thể đơn giản hóa lớp bằng cú pháp async/await để truy cập trình dọn dẹp phản hồi.

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 
    } 
} 

Nên có thể truy cập các chi tiết cần thiết từ phản hồi trước khi trả lại.

Tham chiếu: HTTP Message Handlers in ASP.NET Web API

Các vấn đề liên quan