32

私のOWINミドルウェアはこんな感じです。(フレームワークは ASP.NET Web API です)。

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呼び出しの前に応答ヘッダーまたはステータスを設定すると、設定したヘッダーとステータスを含む応答がクライアントに返されます。これらを設定する正しい方法は何ですか?

4

3 に答える 3

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

  2. Invoke on Next を呼び出した後に応答に何かを設定しても機能しないと考えられる理由は、誰かが応答本文ストリームへの書き込みを開始するとすぐに応答 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の功績。

于 2013-07-07T14:59:25.727 に答える
0

このコードを使用して、すべてのリクエストにかかる時間を取得しました。

appBuilder.Use(async (context, next) =>
        {
            var watch = new Stopwatch();
            watch.Start();
            await next();
            watch.Stop();
            context.Response.Headers.Set("ResponseTime", watch.Elapsed.Seconds.ToString());
        });
于 2020-01-31T10:12:49.627 に答える