Share via


Minimal API アプリのミドルウェア

WebApplication では、特定の条件に応じて、Minimal API applications に次のミドルウェアが自動的に追加されます。

  • UseDeveloperExceptionPage は、HostingEnvironment"Development" である場合、最初に追加されます。
  • UseRouting は、ユーザー コードによって UseRouting がまだ呼び出されておらず、エンドポイントが構成されている (app.MapGet など) 場合、2 番目に追加されます。
  • UseEndpoints は、エンドポイントが構成されている場合、ミドルウェア パイプラインの最後に追加されます。
  • UseAuthentication は、ユーザー コードによって UseAuthentication がまだ呼び出されておらず、サービス プロバイダーで IAuthenticationSchemeProvider が検出できる場合、UseRouting の直後に追加されます。 IAuthenticationSchemeProvider は、AddAuthentication を使用するときに既定で追加され、サービスは IServiceProviderIsService を使用して検出されます。
  • UseAuthorization は、ユーザー コードによって UseAuthorization がまだ呼び出されておらず、サービス プロバイダーで IAuthorizationHandlerProvider が検出できる場合、次に追加されます。 IAuthorizationHandlerProvider は、AddAuthorization を使用するときに既定で追加され、サービスは IServiceProviderIsService を使用して検出されます。
  • ユーザーが構成したミドルウェアとエンドポイントは、UseRoutingUseEndpoints の間に追加されます。

次のコードは、アプリに追加される自動ミドルウェアがどのようなものを生成するかを示しています。

if (isDevelopment)
{
    app.UseDeveloperExceptionPage();
}

app.UseRouting();

if (isAuthenticationConfigured)
{
    app.UseAuthentication();
}

if (isAuthorizationConfigured)
{
    app.UseAuthorization();
}

// user middleware/endpoints
app.CustomMiddleware(...);
app.MapGet("/", () => "hello world");
// end user middleware/endpoints

app.UseEndpoints(e => {});

場合によっては、既定のミドルウェア構成がアプリに対して正しくなく、変更が必要になることがあります。 たとえば、UseCorsUseAuthenticationUseAuthorization の前に呼び出される必要があります。 UseCors を呼び出す場合、アプリでは UseAuthenticationUseAuthorization を呼び出す必要があります。

app.UseCors();
app.UseAuthentication();
app.UseAuthorization();

ルートの照合が発生する前にミドルウェアを実行する必要がある場合は、UseRouting を呼び出す必要があり、ミドルウェアは UseRouting への呼び出しの前に配置する必要があります。 この場合、UseEndpoints は前述のように自動的に追加されるため、必要ありません。

app.Use((context, next) =>
{
    return next(context);
});

app.UseRouting();

// other middleware and endpoints

ターミナル ミドルウェアを追加する場合:

  • このミドルウェアは、UseEndpoints の後に追加される必要があります。
  • ターミナル ミドルウェアが正しい場所に配置されるようにするため、アプリで UseRoutingUseEndpoints を呼び出す必要があります。
app.UseRouting();

app.MapGet("/", () => "hello world");

app.UseEndpoints(e => {});

app.Run(context =>
{
    context.Response.StatusCode = 404;
    return Task.CompletedTask;
});

ターミナル ミドルウェアは、いずれのエンドポイントによっても要求が処理されない場合に実行されるミドルウェアです。

WebApplication では、特定の条件に応じて、Minimal API applications に次のミドルウェアが自動的に追加されます。

  • UseDeveloperExceptionPage は、HostingEnvironment"Development" である場合、最初に追加されます。
  • UseRouting は、ユーザー コードによって UseRouting がまだ呼び出されておらず、エンドポイントが構成されている (app.MapGet など) 場合、2 番目に追加されます。
  • UseEndpoints は、エンドポイントが構成されている場合、ミドルウェア パイプラインの最後に追加されます。
  • UseAuthentication は、ユーザー コードによって UseAuthentication がまだ呼び出されておらず、サービス プロバイダーで IAuthenticationSchemeProvider が検出できる場合、UseRouting の直後に追加されます。 IAuthenticationSchemeProvider は、AddAuthentication を使用するときに既定で追加され、サービスは IServiceProviderIsService を使用して検出されます。
  • UseAuthorization は、ユーザー コードによって UseAuthorization がまだ呼び出されておらず、サービス プロバイダーで IAuthorizationHandlerProvider が検出できる場合、次に追加されます。 IAuthorizationHandlerProvider は、AddAuthorization を使用するときに既定で追加され、サービスは IServiceProviderIsService を使用して検出されます。
  • ユーザーが構成したミドルウェアとエンドポイントは、UseRoutingUseEndpoints の間に追加されます。

次のコードは、アプリに追加される自動ミドルウェアがどのようなものを生成するかを示しています。

if (isDevelopment)
{
    app.UseDeveloperExceptionPage();
}

app.UseRouting();

if (isAuthenticationConfigured)
{
    app.UseAuthentication();
}

if (isAuthorizationConfigured)
{
    app.UseAuthorization();
}

// user middleware/endpoints
app.CustomMiddleware(...);
app.MapGet("/", () => "hello world");
// end user middleware/endpoints

app.UseEndpoints(e => {});

場合によっては、既定のミドルウェア構成がアプリに対して正しくなく、変更が必要になることがあります。 たとえば、UseCorsUseAuthenticationUseAuthorization の前に呼び出される必要があります。 UseCors を呼び出す場合、アプリでは UseAuthenticationUseAuthorization を呼び出す必要があります。

app.UseCors();
app.UseAuthentication();
app.UseAuthorization();

ルートの照合が発生する前にミドルウェアを実行する必要がある場合は、UseRouting を呼び出す必要があり、ミドルウェアは UseRouting への呼び出しの前に配置する必要があります。 この場合、UseEndpoints は前述のように自動的に追加されるため、必要ありません。

app.Use((context, next) =>
{
    return next(context);
});

app.UseRouting();

// other middleware and endpoints

ターミナル ミドルウェアを追加する場合:

  • このミドルウェアは、UseEndpoints の後に追加される必要があります。
  • ターミナル ミドルウェアが正しい場所に配置されるようにするため、アプリで UseRoutingUseEndpoints を呼び出す必要があります。
app.UseRouting();

app.MapGet("/", () => "hello world");

app.UseEndpoints(e => {});

app.Run(context =>
{
    context.Response.StatusCode = 404;
    return Task.CompletedTask;
});

ターミナル ミドルウェアは、いずれのエンドポイントによっても要求が処理されない場合に実行されるミドルウェアです。

Minimal API の偽造防止ミドルウェアの詳細については、「ASP.NET Core でのクロスサイト リクエスト フォージェリ (XSRF/CSRF) 攻撃の防止」を参照してください

ミドルウェアの詳細については、「ASP.NET Core のミドルウェア」、およびアプリケーションに追加できる組み込みミドルウェアの一覧を参照してください。

最小 API の詳細については、「Minimal APIs overview」を参照してください。