2013-07-07 20 views
22

私のOWINミドルウェアはこのようなものです。 (フレームワークはASP.NET Web APIです)。OWINミドルウェアからの応答オブジェクトの変更

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; 

    } 
} 

質問:

  1. OwinMiddlewareから派生することをお勧めますか?私はKatanaのソースでは、ミドルウェアクラスのいくつかはOwinMiddlewareから派生していますが、いくつかはそうではありません。

  2. リクエストヘッダーは大丈夫です。ミドルウェアでNext.Invokeの後に応答ヘッダーまたはステータスコードを設定しても、クライアントに返される応答には影響しません。しかし、Next.Invokeコールの前に応答ヘッダーまたはステータスを設定すると、ヘッダーと設定したステータスの応答がクライアントに返されます。これらを設定する正しい方法は何ですか?

答えて

25
  1. はい、OwinMiddlewareから導出することをお勧めします。いくつかのミドルウェアクラスがOwinMiddlewareから派生しない理由は、クラスが最近導入されたために切り替えられていないかです。または何らかの理由でアセンブリがMicrosoft.Owinアセンブリに依存するのを避けるためです。

  2. [次への呼び出し]を呼び出した後の応答の設定理由は、誰でも応答本文ストリームへの書き込みを開始するとすぐに応答HTTPヘッダーが送信されるということです。したがって、ミドルウェアコンポーネントがレスポンス本体に書き出しを開始した後のステータスコードまたはHTTPヘッダーの変更は、何の効果もありません。

あなたが試みることができるのは、OWINが提供するOnSendingHeadersコールバックを使用することです。使用方法は次のとおりです。

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

私の答えを更新するためにbiscuit314に入会してください。

+0

おかげユーセフ:ここ

はユーセフのコードのバージョンがあります。ポイント#2の場合、Katanaソースまたは他のどこかのサンプルコードが、ベストプラクティスのptから見えますか? OWINミドルウェアを使用する場合、私が求めていることはかなり一般的な必要性であり、このストリームを単に応答ヘッダーを設定するために切り替えることになっていると思いますか?すべてのポインタが評価されます。 – Badri

+0

あなたの提案に従うことで問題を解決できますが、簡単な方法はありませんか?つまり、特にWeb APIのメッセージハンドラに使用されている場合は、応答ヘッダーを途中で設定するだけでは大したことではありません。 – Badri

+3

簡単な方法で答えを更新しました。それが動作すれば教えてください。 –

7

マイナーなバグを修正し、OwinMiddlewareが現在どのように機能しているかを例にして、Youssefの優れた答えを編集しようとしました。

編集が拒否されました(1人で承認、1人で拒否されました)。編集が拒否されました。

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はこのオーバーライドでのみ機能します – Raffaeu

関連する問題