ASP.NET Core 应用基于一系列 中间件构建。 中间件是按管道排列的处理程序,用于处理请求和响应。 在 Web 窗体应用中,HTTP 处理程序和模块解决了类似的问题。 在 ASP.NET Core 中,模块、处理程序、 Global.asax.cs和应用生命周期将替换为中间件。 在本章中,你将了解应用上下文 Blazor 中的中间件。
概述
ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
上图缺少生命周期事件的概念。 这种概念是 ASP.NET Web 窗体如何处理请求的基础。 通过此系统,可以更轻松地推理正在发生的进程,并允许在任何时刻插入中间件。 中间件按照添加到请求管道的顺序执行。 它们还会在代码中添加,而不是配置文件,通常位于 Startup.cs中。
武士刀
熟悉 Katana 的读者在 ASP.NET Core 中会感到舒服。 事实上,Katana 是 ASP.NET Core 派生的框架。 它为 ASP.NET 4.x 引入了类似的中间件和管道模式。 为 Katana 设计的中间件可以适应与 ASP.NET 核心管道配合使用。
常见中间件
ASP.NET 4.x 包含许多模块。 同样,ASP.NET Core 也提供了许多中间件组件。 在某些情况下,IIS 模块可用于 ASP.NET Core。 在其他情况下,可以使用本机 ASP.NET 核心中间件。
下表列出了 ASP.NET Core 中的替换中间件和组件。
模块 | ASP.NET 4.x 模块 | ASP.NET 核心选项 |
---|---|---|
HTTP 错误 | CustomErrorModule |
状态代码页中间件 |
默认文档 | DefaultDocumentModule |
默认文件中间件 |
目录浏览 | DirectoryListingModule |
目录浏览中间件 |
动态压缩 | DynamicCompressionModule |
响应压缩中间件 |
失败的请求跟踪 | FailedRequestsTracingModule |
ASP.NET 核心日志记录 |
文件缓存 | FileCacheModule |
响应缓存中间件 |
HTTP 缓存 | HttpCacheModule |
响应缓存中间件 |
HTTP 日志记录 | HttpLoggingModule |
ASP.NET 核心日志记录 |
HTTP 重定向 | HttpRedirectionModule |
URL 重写中间件 |
ISAPI 筛选器 | IsapiFilterModule |
中间件 |
ISAPI | IsapiModule |
中间件 |
请求筛选 | RequestFilteringModule |
URL 重写中间件 IRule |
URL 重写† | RewriteModule |
URL 重写中间件 |
静态压缩 | StaticCompressionModule |
响应压缩中间件 |
静态内容 | StaticFileModule |
静态文件中间件 |
URL 授权 | UrlAuthorizationModule |
ASP.NET 核心标识 |
此列表并不详尽,但应该了解两个框架之间的映射。 有关更详细的列表,请参阅 具有 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 中间件。