共用方式為


模組、處理程式和中間件

小提示

本內容節錄自《Blazor for ASP NET Web Forms Developers for Azure》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。

Blazor-for-ASP-NET-Web-Forms-Developers 電子書封面縮圖。

ASP.NET Core 應用程式建置在一系列 中間件上。 中間件是排列成管線來處理要求和響應的處理程式。 在 Web Forms 應用程式中,HTTP 處理程式和模組可解決類似的問題。 在 ASP.NET Core 中,模組、處理程式、 Global.asax.cs和應用程式生命週期會取代為中間件。 在本章中,您將瞭解 Blazor 應用程式中的中介軟體。

概觀

ASP.NET Core 要求管線由要求委派序列組成,並會一個接著一個呼叫。 下圖說明此概念。 執行線程按照黑色箭頭的方向執行。

管道

上圖缺少生命週期事件的概念。 此概念是 ASP.NET Web Forms 處理請求的基礎。 此系統可讓您更輕鬆地推理正在發生的進程,並允許在任何時間點插入中間件。 中間件會依新增至要求管線的順序執行。 它們也會在程式代碼中新增,而不是組態檔,通常是在 Startup.cs中。

武士刀

熟悉 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 核心選項
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 中介軟體