模块、处理程序和中间件

小窍门

此内容摘自电子书《面向 Azure ASP.NET Web Forms 开发人员的 Blazor》,可在 .NET 文档上获取,也可作为免费可下载的 PDF 脱机阅读。

《面向 ASP NET Web Forms 开发人员的 Blazor》电子书封面缩略图。

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 中间件