模块、处理程序和中间件
ASP.NET Core 应用基于一系列中间件构建。 中间件是排列到管道中的处理程序,用于处理请求和响应。 在 Web Forms 应用中,HTTP 处理程序和模块解决了类似的问题。 ASP.NET Core 中,中间件取代了模块、处理程序、Global.asax.cs 和应用生命周期。 在本章中,你将了解 Blazor 应用背景下的中间件。
概述
ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
上面的关系图缺少生命周期事件的概念。 此概念是处理 ASP.NET Web Forms 请求的基础。 此系统使推理正在发生的过程更加容易,并允许在任意点插入中间件。 中间件按其添加到请求管道中的顺序执行。 它们还可以添加到代码中,而不是配置文件中(通常是在 Startup.cs 中)。
Katana
熟悉 Katana 的读者会觉得使用 ASP.NET Core 非常轻松。 事实上,Katana 是派生出 ASP.NET Core 的框架。 它为 ASP.NET 4.x 引入了类似的中间件和管道模式。 针对 Katana 设计的中间件可以改为使用 ASP.NET Core 管道。
常见中间件
ASP.NET 4.x 包含许多模块。 同样,ASP.NET Core 还提供了许多中间件组件。 在某些情况下,可以将 IIS 模块 与 ASP.NET Core 配合使用。 在其他情况下,可以使用本机 ASP.NET Core 中间件。
下表列出了 ASP.NET Core 中的替换中间件和组件。
模块 | ASP.NET 4.x 模块 | ASP.NET Core 选项 |
---|---|---|
HTTP 错误 | CustomErrorModule |
状态代码页中间件 |
默认文档 | DefaultDocumentModule |
默认文件中间件 |
目录浏览 | DirectoryListingModule |
目录浏览中间件 |
动态压缩 | DynamicCompressionModule |
响应压缩中间件 |
失败的请求跟踪 | FailedRequestsTracingModule |
ASP.NET Core 日志记录 |
文件缓存 | FileCacheModule |
响应缓存中间件 |
HTTP 缓存 | HttpCacheModule |
响应缓存中间件 |
HTTP 日志记录 | HttpLoggingModule |
ASP.NET Core 日志记录 |
HTTP 重定向 | HttpRedirectionModule |
URL 重写中间件 |
ISAPI 筛选器 | IsapiFilterModule |
中间件 |
ISAPI | IsapiModule |
中间件 |
请求筛选 | RequestFilteringModule |
URL 重写中间件 IRule |
URL 重写† | RewriteModule |
URL 重写中间件 |
静态压缩 | StaticCompressionModule |
响应压缩中间件 |
静态内容 | StaticFileModule |
静态文件中间件 |
URL 授权 | UrlAuthorizationModule |
ASP.NET Core 标识 |
此列表并不详尽,但它应该能够提供两个框架之间存在哪些映射的概念。 若要获取更详细的列表,请参阅使用 ASP.NET Core 的 IIS 模块。
自定义中间件
内置中间件可能无法处理应用所需的所有场景。 在这种情况下,创建自己的中间件非常有意义。 定义中间件的方式有多种,最简单的方法是使用简单的委托。 请考虑以下中间件,它接受来自查询字符串的区域性请求:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await next();
});
app.Run(async (context) =>
await context.Response.WriteAsync(
$"Hello {CultureInfo.CurrentCulture.DisplayName}"));
}
}
还可以通过实现 IMiddleware
接口或按照中间件约定将中间件定义为类。 有关详细信息,请参阅编写自定义 ASP.NET Core 中间件。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈