2013-07-07 31 views
22

Phần mềm trung gian OWIN của tôi giống như thế này. (Framework là ASP.NET Web API).Thay đổi đối tượng phản hồi từ OWIN Middleware

public class MyMiddleware : OwinMiddleware 
{ 
    public MyMiddleware(OwinMiddleware next) : base(next) { } 

    public override async Task Invoke(OwinRequest request, OwinResponse response) 
    { 
     var header = request.GetHeader("X-Whatever-Header"); 

     await Next.Invoke(request, response); 

     response.SetHeader("X-MyResponse-Header", "Some Value"); 
     response.StatusCode = 403; 

    } 
} 

Câu hỏi:

  1. Đó có phải là thực tế nên xuất phát từ OwinMiddleware? Tôi thấy rằng trong nguồn Katana, một số lớp trung gian xuất phát từ OwinMiddleware và một số thì không.

  2. Tôi có thể thấy tiêu đề yêu cầu không sao. Đặt tiêu đề phản hồi hoặc mã trạng thái sau Next.Invoke trong phần mềm trung gian của tôi không ảnh hưởng đến phản hồi được trả về cho khách hàng. Nhưng nếu tôi đặt tiêu đề phản hồi hoặc trạng thái trước cuộc gọi Next.Invoke, phản hồi với tiêu đề và trạng thái tôi đặt được trả về cho ứng dụng khách. Cách thích hợp để thiết lập những điều này là gì?

Trả lời

25
  1. Vâng, bắt nguồn từ OwinMiddleware được khuyến khích. Lý do một số lớp phần mềm trung gian không lấy được từ OwinMiddleware là chúng chưa chuyển sang vì lớp đã được giới thiệu gần đây. Hoặc để tránh việc lắp ráp mất một sự phụ thuộc vào việc lắp ráp Microsoft.Owin vì một lý do nào đó.

  2. Lý do có thể xảy ra khi phản hồi sau khi gọi Invoke on Next không hoạt động là tiêu đề HTTP phản hồi được gửi ngay sau khi bất kỳ ai bắt đầu ghi vào luồng nội dung phản hồi. Vì vậy, bất kỳ thay đổi nào đối với mã trạng thái hoặc tiêu đề HTTP sau khi thành phần phần mềm trung gian bắt đầu ghi vào nội dung phản hồi sẽ không có bất kỳ ảnh hưởng nào.

Điều bạn có thể thử làm là sử dụng hàm gọi lại OnSendingHeaders mà OWIN cung cấp. Dưới đây là cách bạn có thể sử dụng:

public override async Task Invoke(IOwinContext context) 
{ 
    var response = context.Response; 
    var request = context.Request; 

    response.OnSendingHeaders(state => 
    { 
     var resp = (OwinResponse)state; 
     resp.Headers.Add("X-MyResponse-Header", "Some Value"); 
     resp.StatusCode = 403; 
     resp.ReasonPhrase = "Forbidden"; 
    }, response); 

    var header = request.Headers["X-Whatever-Header"]; 

    await Next.Invoke(context); 
} 

Tín dụng cho biscuit314 để cập nhật câu trả lời của tôi.

+0

Cảm ơn Youssef. Đối với điểm số 2, có một mã ví dụ trong nguồn Katana hoặc một nơi khác mà tôi có thể xem xét, từ điểm thực hành tốt nhất của pt không? Tôi tin rằng, những gì tôi yêu cầu là một nhu cầu khá phổ biến và mọi người phải làm luồng này chuyển đổi chỉ để đặt tiêu đề phản hồi, nếu chúng ta sử dụng phần mềm trung gian OWIN? Mọi con trỏ sẽ được đánh giá cao. – Badri

+0

Tôi có thể giải quyết sự cố bằng cách làm theo đề xuất của bạn nhưng không có cách nào dễ dàng? Tôi có nghĩa là đây là quá nhiều công việc để chỉ cần thiết lập một tiêu đề phản ứng trên đường ra, đặc biệt là nếu một được sử dụng để xử lý tin nhắn Web API. – Badri

+3

Cập nhật câu trả lời bằng một phương pháp đơn giản hơn. Xin vui lòng cho tôi biết nếu nó hoạt động. –

7

Tôi đã cố gắng chỉnh sửa câu trả lời tuyệt vời của Youssef để sửa lỗi nhỏ và cập nhật ví dụ về cách OwinMiddleware hoạt động.

Chỉnh sửa đã bị từ chối (tốt, được chấp thuận bởi một, bị từ chối bởi vì quá nhỏ và bị từ chối bởi hai vì quá lớn).

Dưới đây là phiên bản của mã Youssef của:

public override async Task Invoke(IOwinContext context) 
{ 
    var response = context.Response; 
    var request = context.Request; 

    response.OnSendingHeaders(state => 
    { 
     var resp = (OwinResponse)state; 
     resp.Headers.Add("X-MyResponse-Header", "Some Value"); 
     resp.StatusCode = 403; 
     resp.ReasonPhrase = "Forbidden"; // if you're going to change the status code 
             // you probably should also change the reason phrase 
    }, response); 

    var header = request.Headers["X-Whatever-Header"]; 

    await Next.Invoke(context); 
} 
+0

OWIN mới chỉ hoạt động với ghi đè này – Raffaeu

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