web-dev-qa-db-ja.com

ASP.NET Coreがカスタムミドルウェアを一度だけ実行するのはなぜですか?

POSTリクエストを受け入れる次のコントローラーを備えたASP.NET Coreがあります。

[Route("api/v1/tenants/tests")]
public class TestsController : Controller
{
    [HttpPost]       
    public IActionResult Post(string tenantId)
    {
        return Ok();
    }
}

私は物事をテストするための「ヌル」ミドルウェアを開発しました。これは、Startup.csファイルのConfigureメソッドで定義されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.UseMvc();

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });
}

質問

Postmanを介してコントローラーを呼び出すと、POSTメソッドへの最初の呼び出しはミドルウェアを通過し、次にコントローラーを正常に通過します。ただし、次の呼び出しはミドルウェアを完全にスキップして直接コントローラーに送られます。何故ですか?

10
Kzrystof

ミドルウェアは、app.UseMvc()を呼び出す前に設定する必要があります

_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });

     // !! Have to be called after setting up middleware !!
     app.UseMvc();
}
_

この情報は documentation にありますが、カスタムミドルウェアにも適用できることは知りませんでした。

Startup.Configureメソッドでミドルウェアコンポーネントが追加される順序は、リクエストでミドルウェアコンポーネントが呼び出される順序と、応答の逆の順序を定義します。順序は、セキュリティ、パフォーマンス、および機能にとって重要です。

次のStartup.Configureメソッドは、一般的なアプリシナリオのミドルウェアコンポーネントを追加します。

1-例外/エラー処理

2-HTTP Strict Transport Security Protocol

3-HTTPSリダイレクト

4-静的ファイルサーバー

5-Cookieポリシーの実施

6-認証

7-セッション

8-MVC

更新

ASP.Net Core 3.0では、MapControllers()の前にミドルウェアを追加する必要があります

_ app.UseEndpoints(endpoints =>
 {
     endpoints.MapControllers();
 });
_
15
Kzrystof

Startup.Configure()は、アプリの起動時に1回実行されます。アプリケーションの準備をするために使用され、すべての呼び出しで実行されるわけではありません。ただし、これを使用して、すべての呼び出しで実行されるミドルウェアをセットアップできます。 asp.netコアアプリケーションのスタートアップに関するMicrosoftのドキュメント には、ConfigureConfigureServicesの両方の例がいくつか含まれています。

2
Dirk Trilsbeek