2013-07-15 20 views
6

Tôi có trình xử lý tin nhắn API web MyHandler mà tôi muốn chạy trong đường ống OWIN làm phần mềm trung gian. Vì vậy, cấu hình trình xử lý như thế này.Chuyển đổi HttpRequestMessage thành OwinRequest và OwinResponse thành HttpResponseMessage

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseHttpMessageHandler(new MyHandler()); 

     HttpConfiguration config = new HttpConfiguration(); 

     config.Routes.MapHttpRoute(
      "DefaultWebApi", 
       "{controller}/{id}", 
        new { id = RouteParameter.Optional }); 

     app.UseWebApi(config); 
    } 
} 

Trình xử lý rất đơn giản và không làm gì cả.

public class MyHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
    { // <--- breakpoint here 

     var response = await base.SendAsync(request, cancellationToken); 
     return response; 
    } 
} 

tôi đặt một điểm break trong SendAsync và nó phá vỡ nhưng sau base.SendAsync bom âm thầm và tôi thấy A first chance exception of type 'System.InvalidOperationException' occurred in System.Net.Http.dll.

Tôi có thể dễ dàng thêm MyHandler vào config.MessageHandlers và nó sẽ chạy hoàn hảo trong đường dẫn API Web nhưng đó không phải là những gì tôi muốn làm. Tôi muốn chạy MyHandler trong đường ống OWIN. cái này nó có hoàn toàn có thể xảy ra được không? Nó nên được. Nếu không, không có điểm nào trong việc có phương pháp mở rộng UseHttpMessageHandler, tôi đoán vậy. Chỉ là tôi không thể tìm ra cách để làm những gì tôi muốn làm.

+0

Tôi nghĩ rằng bạn đang bối rối các khái niệm về xử lý tin nhắn và xử lý ủy nhiệm. Trình xử lý tin nhắn chỉ là một thứ yêu cầu và trả về một câu trả lời. –

+0

Tôi hiểu sự khác biệt giữa trình xử lý tin nhắn và trình xử lý ủy nhiệm. Một trình xử lý ủy nhiệm là một trình xử lý tin nhắn và tôi chỉ hy vọng rằng tôi có thể sử dụng một trình xử lý ủy nhiệm thay cho trình xử lý tin nhắn và nó sẽ chạy trong đường ống OWIN như nó chạy trong một đường dẫn API Web và dường như không thể , dựa trên câu trả lời của Kiran. Tôi đồng ý tôi quá tham vọng. Cảm ơn bạn đã xem câu hỏi của tôi. – Badri

Trả lời

1

Vâng, trải nghiệm này cần được cải thiện vì ngoại lệ được bỏ qua âm thầm.

Đối với kịch bản trên, bạn sẽ cần phải xuất phát từ HttpMessageHandler thay vì DelegatingHandler như xử lý Delegating sẽ cố gắng để ủy thác theo yêu cầu để xử lý sau đó (ví dụ: Trường hợp ngoại lệ đề cập Message=The inner handler has not been assigned).

Ví dụ, sau đây sẽ làm việc:

appBuilder.UseHttpMessageHandler(new MyNonDelegatingHandler()); 

public class MyNonDelegatingHandler : HttpMessageHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     HttpResponseMessage response = new HttpResponseMessage(); 
     response.Content = new StringContent("Hello!"); 

     return Task.FromResult<HttpResponseMessage>(response); 
    } 
} 

Và để tạo một chuỗi các xử lý, bạn có thể làm như sau:

appBuilder.UseHttpMessageHandler(HttpClientFactory.CreatePipeline(innerHandler: new MyNonDelegatingMessageHandler(), 
      handlers: new DelegatingHandler[] { new DelegatingHandlerA(), new DelegatingHandlerB() })); 
+0

Cảm ơn, điều này làm rõ một chút. Một câu hỏi cuối cùng. Chỉ có thể 'HttpMessageHandler' được biến thành một phần mềm trung gian OWIN bằng cách sử dụng bộ điều hợp? Tôi đã hy vọng chúng tôi có thể một cái gì đó như thế cho các đại biểu xử lý quá. Trong trường hợp của tôi, tôi cũng cần xem thông điệp phản hồi. – Badri

+0

Tôi hiểu. Đối với một số rõ ràng, hai 'UseWebApi' phần mở rộng hookup một' HttpServer' và phần mở rộng 'UseHttpMessageHandler' không hookup nó và cung cấp cho bạn các tùy chọn xây dựng một đường ống như tôi đã đề cập trong bài viết. Bây giờ đến câu hỏi của bạn về việc xem xét phản hồi, tôi nghĩ bạn sẽ cần phải móc trong một phần mềm trung gian chung của OWIN, nơi bạn có thể kiểm tra phản hồi chứ không phải một HttpMessageHandler. Đường ống yêu cầu sau đó sẽ trông giống như: '-> MyOwinInspectorMiddleware-> HttpMessageHandlerAdapter-> HttpServer (HandlerA -> HanlerB -> etc)' –

+0

@KiranChalla Xin chào, phần mở rộng này của 'UseHttpMessageHandler' ở đâu? Tôi không thể tìm thấy nó trong nguồn Katana. – Aliostad

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