最小 API 应用中的中间件
注意
此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
根据某些条件,WebApplication
会自动在 Minimal API applications
中添加以下中间件:
- 当
HostingEnvironment
为"Development"
时,将首先添加UseDeveloperExceptionPage
。 - 如果用户代码尚未调用
UseRouting
并且配置了终结点(例如app.MapGet
),则其次添加UseRouting
。 - 如果配置了任何终结点,则会在中间件管道的末尾添加
UseEndpoints
。 - 如果用户代码尚未调用
UseAuthentication
,并且如果可以在服务提供商中检测到IAuthenticationSchemeProvider
,则会在UseRouting
后立即添加UseAuthentication
。 使用AddAuthentication
时,默认情况下会添加IAuthenticationSchemeProvider
,并使用IServiceProviderIsService
检测服务。 - 如果用户代码尚未调用
UseAuthorization
,并且如果可以在服务提供商中检测到IAuthorizationHandlerProvider
,则接下来会添加UseAuthorization
。 使用AddAuthorization
时,默认情况下会添加IAuthorizationHandlerProvider
,并使用IServiceProviderIsService
检测服务。 - 在
UseRouting
和UseEndpoints
之间添加用户配置的中间件和终结点。
以下代码实际上是添加到应用程序的自动中间件生成的代码:
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 => {});
在某些情况下,应用程序的默认中间件配置不正确,需要修改。 例如,应在 UseAuthentication 和 UseAuthorization 前调用 UseCors。 如果调用 UseCors
,应用需要调用 UseAuthentication
和 UseAuthorization
:
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
如果在路由匹配发生前应运行中间件,则应调用 UseRouting,并且应在调用 UseRouting
之前放置中间件。 在这种情况下,不需要 UseEndpoints,因为它会自动添加,如上所述:
app.Use((context, next) =>
{
return next(context);
});
app.UseRouting();
// other middleware and endpoints
添加终端中间件时:
- 必须在
UseEndpoints
后添加中间件。 - 应用需要调用
UseRouting
和UseEndpoints
,以便终端中间件可以放置在正确的位置。
app.UseRouting();
app.MapGet("/", () => "hello world");
app.UseEndpoints(e => {});
app.Run(context =>
{
context.Response.StatusCode = 404;
return Task.CompletedTask;
});
在没有终结点处理请求时运行的中间件。
根据某些条件,WebApplication
会自动在 Minimal API applications
中添加以下中间件:
- 当
HostingEnvironment
为"Development"
时,将首先添加UseDeveloperExceptionPage
。 - 如果用户代码尚未调用
UseRouting
并且配置了终结点(例如app.MapGet
),则其次添加UseRouting
。 - 如果配置了任何终结点,则会在中间件管道的末尾添加
UseEndpoints
。 - 如果用户代码尚未调用
UseAuthentication
,并且如果可以在服务提供商中检测到IAuthenticationSchemeProvider
,则会在UseRouting
后立即添加UseAuthentication
。 使用AddAuthentication
时,默认情况下会添加IAuthenticationSchemeProvider
,并使用IServiceProviderIsService
检测服务。 - 如果用户代码尚未调用
UseAuthorization
,并且如果可以在服务提供商中检测到IAuthorizationHandlerProvider
,则接下来会添加UseAuthorization
。 使用AddAuthorization
时,默认情况下会添加IAuthorizationHandlerProvider
,并使用IServiceProviderIsService
检测服务。 - 在
UseRouting
和UseEndpoints
之间添加用户配置的中间件和终结点。
以下代码实际上是添加到应用程序的自动中间件生成的代码:
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 => {});
在某些情况下,应用程序的默认中间件配置不正确,需要修改。 例如,应在 UseAuthentication 和 UseAuthorization 前调用 UseCors。 如果调用 UseCors
,应用需要调用 UseAuthentication
和 UseAuthorization
:
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
如果在路由匹配发生前应运行中间件,则应调用 UseRouting,并且应在调用 UseRouting
之前放置中间件。 在这种情况下,不需要 UseEndpoints,因为它会自动添加,如上所述:
app.Use((context, next) =>
{
return next(context);
});
app.UseRouting();
// other middleware and endpoints
添加终端中间件时:
- 必须在
UseEndpoints
后添加中间件。 - 应用需要调用
UseRouting
和UseEndpoints
,以便终端中间件可以放置在正确的位置。
app.UseRouting();
app.MapGet("/", () => "hello world");
app.UseEndpoints(e => {});
app.Run(context =>
{
context.Response.StatusCode = 404;
return Task.CompletedTask;
});
在没有终结点处理请求时运行的中间件。
有关最小 API 中防伪造的信息,请参阅在 ASP.NET Core 中阻止跨网站请求伪造 (XSRF/CSRF) 攻击
有关中间件的详细信息,请参阅 ASP.NET Core 中间件,以及可添加到应用程序的内置中间件列表。
有关最小 API 的详细信息,请参阅 Minimal APIs overview
。