国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ASP.NET Core 基礎(chǔ)知識】--中間件--什么是中間件

這篇具有很好參考價值的文章主要介紹了【ASP.NET Core 基礎(chǔ)知識】--中間件--什么是中間件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本篇文章作為中間件單元的開篇文章,通過這篇文章可以了解什么是中間件、內(nèi)置中間件的使用以及怎么創(chuàng)建自定義中間件。我們先來看一下中間件的角色、目的和重要性。

1. 角色
  • 請求處理管道的構(gòu)建塊: 中間件是構(gòu)成ASP.NET Core請求處理管道的基本組成部分。每個HTTP請求都通過一系列中間件,這些中間件負(fù)責(zé)處理請求的不同方面。
  • 處理請求和響應(yīng): 中間件可以用于處理傳入的HTTP請求和生成相應(yīng)的HTTP響應(yīng)。它們在整個請求生命周期中執(zhí)行特定的功能,如身份驗證、日志記錄、錯誤處理等。
  • 可組合和可擴展: 中間件的模型允許它們以可組合和可插拔的方式工作,使開發(fā)者能夠根據(jù)應(yīng)用程序的需求輕松地添加、移除或修改中間件。
2. 目的
  • 模塊化開發(fā): 中間件允許開發(fā)者將應(yīng)用程序的功能劃分為小而獨立的組件。每個中間件都專注于某個特定方面的處理,使得代碼更易于理解、測試和維護。
  • 請求管道控制: 中間件允許開發(fā)者在請求管道中控制流程。通過特定的順序排列中間件,可以精確地定義請求處理的流程,確保每個中間件按照預(yù)期的方式執(zhí)行。
  • 可配置性: 中間件可以通過配置進行自定義,以滿足應(yīng)用程序的需求。這使得應(yīng)用程序的行為能夠根據(jù)具體場景動態(tài)調(diào)整,而無需修改核心代碼。
3. 重要性:
  • 增強可測試性: 由于中間件是獨立的組件,可以更容易地進行單元測試。這提高了應(yīng)用程序的可測試性,使開發(fā)者能夠更自信地修改和擴展功能。
  • 提高靈活性: 中間件的靈活性使得應(yīng)用程序能夠適應(yīng)不同的需求和場景。通過簡單地添加或替換中間件,開發(fā)者可以調(diào)整應(yīng)用程序的行為,而不必重新設(shè)計整個系統(tǒng)。
  • 簡化開發(fā)流程: 中間件簡化了許多常見任務(wù),如身份驗證、授權(quán)、緩存和日志記錄等。開發(fā)者可以專注于業(yè)務(wù)邏輯,而不必過多關(guān)注底層的HTTP處理細(xì)節(jié)。

一、什么是中間件

1.1 中間件的定義

在軟件開發(fā)中,中間件是連接兩個不同應(yīng)用程序或軟件組件的軟件層。它位于兩個系統(tǒng)或組件之間,充當(dāng)通信、數(shù)據(jù)傳遞或功能交互的橋梁。中間件的主要目標(biāo)是簡化系統(tǒng)集成和提供一致的接口,使得不同組件能夠有效地協(xié)同工作。在ASP.NET Core中,中間件是一種特定類型的組件,用于處理HTTP請求和響應(yīng)。ASP.NET Core中間件在請求管道中按照順序執(zhí)行,每個中間件執(zhí)行特定的任務(wù)或操作。這些中間件可以包括預(yù)處理請求、進行身份驗證、記錄日志、路由請求等功能。中間件的靈活性和可組合性使得開發(fā)者能夠輕松地擴展、配置和定制應(yīng)用程序的行為。

Tip:中間件是連接和協(xié)調(diào)不同軟件組件的關(guān)鍵元素,而在ASP.NET Core中,它是構(gòu)建請求處理管道的基本構(gòu)件,用于處理HTTP請求和響應(yīng)的各個方面。

1.2 中間件的位置和作用

中間件的位置和作用在ASP.NET Core中主要涉及請求處理管道。

  1. 位置
    ASP.NET Core中間件的位置決定了它們在請求處理管道中的執(zhí)行順序。請求處理管道是由一系列中間件組成的,每個中間件負(fù)責(zé)在請求處理過程中執(zhí)行特定的任務(wù)。

    • 在請求管道的起始位置: 有些中間件位于請求管道的起始位置,這些中間件首先處理傳入的HTTP請求。例如,靜態(tài)文件中間件通常位于管道的起始位置,用于提供靜態(tài)資源。
    • 在請求管道的中間位置: 大多數(shù)中間件位于請求管道的中間位置,執(zhí)行各種任務(wù),如身份驗證、授權(quán)、日志記錄等。這些中間件在請求處理的不同階段介入,按照配置的順序執(zhí)行。
    • 在請求管道的末尾位置: 一些中間件位于請求管道的末尾位置,用于處理響應(yīng)。例如,最終的中間件可能負(fù)責(zé)生成HTTP響應(yīng),結(jié)束請求處理流程。
  2. 作用:
    中間件在ASP.NET Core中的作用是多樣的,它們可以執(zhí)行各種任務(wù)以滿足應(yīng)用程序的需求。以下是一些常見的中間件作用:

    • 處理請求: 中間件可以處理傳入的HTTP請求,進行預(yù)處理、驗證和轉(zhuǎn)發(fā)。
    • 生成響應(yīng): 一些中間件負(fù)責(zé)生成HTTP響應(yīng),將結(jié)果返回給客戶端。
    • 身份驗證和授權(quán): 中間件用于處理用戶身份驗證和授權(quán),確保請求的安全性。
    • 路由: 路由中間件根據(jù)請求的URL路徑將請求導(dǎo)向正確的處理程序。
    • 日志記錄: 中間件可以記錄請求和應(yīng)答的信息,用于調(diào)試和監(jiān)控。
    • 異常處理: 中間件可以捕獲和處理請求處理過程中發(fā)生的異常。
    • 緩存: 緩存中間件可以緩存響應(yīng),提高性能并減少對后端服務(wù)的負(fù)載。

中間件的作用因其類型而異,開發(fā)者可以根據(jù)應(yīng)用程序的需求選擇性地添加、配置和組合中間件,以實現(xiàn)特定的功能和行為。整個中間件體系的設(shè)計使得開發(fā)者能夠輕松地定制應(yīng)用程序的請求處理流程。

1.3 中間件的分類
  1. 內(nèi)置中間件
    在ASP.NET Core中,有一些內(nèi)置的中間件,它們提供了常見的功能和服務(wù),方便開發(fā)者在應(yīng)用程序中使用。以下是一些常見的內(nèi)置中間件的分類:
    • 靜態(tài)文件中間件:

      • 功能: 提供對靜態(tài)文件(如HTML、CSS、JavaScript、圖像等)的服務(wù),使它們能夠被直接訪問,而無需通過應(yīng)用程序邏輯。
      • 使用場景: 處理和提供靜態(tài)資源,加速頁面加載速度。
      • 使用方式: 使用app.UseStaticFiles()配置在請求管道中添加靜態(tài)文件中間件。
    • 路由中間件:

      • 功能: 實現(xiàn)URL路由,將傳入的請求映射到相應(yīng)的處理程序。
      • 使用場景: 定義應(yīng)用程序的URL結(jié)構(gòu),將請求導(dǎo)向正確的控制器和操作。
      • 使用方式: 使用app.UseRouting()app.UseEndpoints()配置路由中間件。
    • 認(rèn)證中間件:

      • 功能: 處理用戶身份驗證,確保用戶是經(jīng)過授權(quán)的。
      • 使用場景: 在應(yīng)用程序中實現(xiàn)用戶登錄和授權(quán)機制。
      • 使用方式: 使用app.UseAuthentication()配置身份驗證中間件。
    • 授權(quán)中間件:

      • 功能: 確保用戶在訪問受保護資源時具有適當(dāng)?shù)臋?quán)限。
      • 使用場景: 控制哪些用戶可以訪問應(yīng)用程序中的不同部分。
      • 使用方式: 使用app.UseAuthorization()配置授權(quán)中間件。
    • 異常處理中間件:

      • 功能: 捕獲應(yīng)用程序中發(fā)生的異常,并提供適當(dāng)?shù)奶幚怼?/li>
      • 使用場景: 提高應(yīng)用程序的穩(wěn)定性,記錄并處理異常情況。
      • 使用方式: 使用app.UseExceptionHandler()配置異常處理中間件。

這些內(nèi)置中間件提供了基本而強大的功能,使得開發(fā)者能夠輕松地實現(xiàn)常見的任務(wù)和需求。它們是構(gòu)建ASP.NET Core應(yīng)用程序的基礎(chǔ),可以通過組合和配置進行定制,滿足具體的業(yè)務(wù)需求。

  1. 自定義中間件
    自定義中間件是開發(fā)者根據(jù)應(yīng)用程序的特定需求而創(chuàng)建的中間件,用于執(zhí)行定制的操作或提供特定的功能。自定義中間件允許開發(fā)者完全控制請求處理管道中的某個階段,執(zhí)行特定的邏輯。以下是自定義中間件的一般分類和特點:
    • 通用自定義中間件:

      • 功能: 提供一般性的、可在多個應(yīng)用程序中重復(fù)使用的功能。
      • 使用場景: 常見的通用功能,如日志記錄、性能監(jiān)控、請求計時等。
      • 實現(xiàn)方式: 根據(jù)需要編寫通用性較強的中間件,可配置以適應(yīng)不同的應(yīng)用程序。
    • 業(yè)務(wù)邏輯中間件:

      • 功能: 執(zhí)行與特定業(yè)務(wù)邏輯相關(guān)的操作,對請求或響應(yīng)進行特定處理。
      • 使用場景: 定制業(yè)務(wù)需求,如特定領(lǐng)域的身份驗證、授權(quán)、數(shù)據(jù)處理等。
      • 實現(xiàn)方式: 編寫與業(yè)務(wù)邏輯相關(guān)的中間件,確保其邏輯與應(yīng)用程序的業(yè)務(wù)需求一致。
    • 安全性中間件:

      • 功能: 實現(xiàn)應(yīng)用程序的安全性策略,處理安全相關(guān)的任務(wù),如防范跨站腳本攻擊(XSS)等。
      • 使用場景: 強化應(yīng)用程序的安全性,防御各類網(wǎng)絡(luò)攻擊。
      • 實現(xiàn)方式: 編寫中間件,處理安全性相關(guān)的任務(wù),如請求過濾、加密、驗證等。
    • 數(shù)據(jù)處理中間件:

      • 功能: 在請求或響應(yīng)階段進行數(shù)據(jù)處理,如格式轉(zhuǎn)換、數(shù)據(jù)驗證等。
      • 使用場景: 定制化數(shù)據(jù)處理需求,確保請求和響應(yīng)的數(shù)據(jù)格式和內(nèi)容符合應(yīng)用程序的要求。
      • 實現(xiàn)方式: 編寫中間件,負(fù)責(zé)數(shù)據(jù)處理的任務(wù),如解析JSON、XML等。
    • 性能優(yōu)化中間件:

      • 功能: 優(yōu)化應(yīng)用程序的性能,進行緩存、壓縮、異步處理等操作。
      • 使用場景: 提高應(yīng)用程序的性能,減少響應(yīng)時間和資源消耗。
      • 實現(xiàn)方式: 編寫中間件,執(zhí)行性能優(yōu)化相關(guān)的任務(wù),如緩存管理、響應(yīng)壓縮等。

自定義中間件的關(guān)鍵在于滿足應(yīng)用程序的獨特需求,確保它們能夠無縫地集成到請求處理管道中。通過自定義中間件,開發(fā)者能夠更靈活地構(gòu)建符合特定業(yè)務(wù)場景和性能要求的ASP.NET Core應(yīng)用程序。

二、中間件的工作原理

2.1 中間件執(zhí)行流程

ASP.NET Core中間件的執(zhí)行流程遵循請求處理管道的模型。請求處理管道是一系列中間件組成的流程,負(fù)責(zé)處理HTTP請求和生成HTTP響應(yīng)。以下是中間件執(zhí)行的基本流程:

  1. 請求流入:
    • 當(dāng)客戶端發(fā)起HTTP請求時,請求首先到達(dá)ASP.NET Core應(yīng)用程序。
  2. 中間件注冊:
    • 在應(yīng)用程序啟動時,開發(fā)者通過在Startup.cs文件中的Configure方法中使用app.UseMiddleware()方法注冊中間件。
    • 中間件的注冊順序決定了它們在管道中的執(zhí)行順序。
  3. 中間件執(zhí)行開始:
    • 當(dāng)請求進入管道時,從管道的起始位置開始執(zhí)行第一個注冊的中間件。
  4. 中間件執(zhí)行順序:
    • 中間件按照它們在Configure方法中注冊的順序執(zhí)行。
    • 每個中間件在請求處理過程中執(zhí)行特定的任務(wù),例如日志記錄、身份驗證、路由等。
  5. 中間件鏈:
    • 中間件的執(zhí)行形成一個鏈?zhǔn)浇Y(jié)構(gòu),每個中間件處理完任務(wù)后將請求傳遞給下一個中間件。
  6. 請求處理:
    • 請求在管道中經(jīng)過一系列中間件,每個中間件都可以對請求進行修改、處理或傳遞給下一個中間件。
  7. 終止條件:
    • 中間件的執(zhí)行可以在任何時候終止,例如某個中間件決定直接生成響應(yīng),不再傳遞給后續(xù)中間件。
  8. 中間件執(zhí)行完成:
    • 當(dāng)請求通過管道中的所有中間件并生成了響應(yīng)時,執(zhí)行流程完成。
  9. 響應(yīng)返回:
    • 響應(yīng)被返回給客戶端。

這個流程允許開發(fā)者通過添加、移除或調(diào)整中間件,靈活地定義請求處理的流程。中間件的執(zhí)行流程是一個基于管道的模型,每個中間件負(fù)責(zé)特定的任務(wù),整個流程形成了一個可配置且易于理解的請求處理過程。

2.2 中間件的生命周期

在ASP.NET Core中,中間件的生命周期是與應(yīng)用程序的請求處理管道緊密相關(guān)的。中間件的生命周期涉及到其實例化、配置和執(zhí)行階段。以下是中間件生命周期的主要階段:

  1. 創(chuàng)建中間件實例:
    • 在ASP.NET Core應(yīng)用程序啟動時,中間件的實例會被創(chuàng)建。這通常在Startup.cs文件中的ConfigureServices方法中進行配置。
  2. 配置中間件:
    • 中間件的配置發(fā)生在Startup.cs文件中的Configure方法中。在這里,開發(fā)者通過調(diào)用app.UseMiddleware()方法配置中間件,指定其執(zhí)行順序等。
  3. 請求處理管道建立:
    • 當(dāng)應(yīng)用程序啟動后,請求處理管道會被建立,其中包括了所有注冊的中間件。
  4. 中間件執(zhí)行:
    • 在請求到達(dá)應(yīng)用程序時,中間件開始按照注冊的順序執(zhí)行。每個中間件對請求進行處理,可能修改請求、生成響應(yīng),或者將請求傳遞給下一個中間件。
  5. 中間件生命周期方法:
    • 中間件可以實現(xiàn)特定的生命周期方法,例如InvokeAsync。這些方法會在中間件實際處理請求時被調(diào)用。
  6. 中間件鏈傳遞:
    • 中間件鏈傳遞是指請求在中間件之間傳遞的過程。一個中間件處理請求后,可以將請求傳遞給下一個中間件,形成鏈?zhǔn)秸{(diào)用。
  7. 中間件終止:
    • 中間件的執(zhí)行可以在任何時候終止,例如某個中間件直接生成了響應(yīng),不再傳遞給后續(xù)中間件。
  8. 中間件生命周期結(jié)束:
    • 當(dāng)請求通過管道中的所有中間件并生成了響應(yīng)時,中間件的生命周期也隨之結(jié)束。
  9. 垃圾回收:
    • 中間件實例可能會在不再需要時由垃圾回收器進行清理。

中間件的生命周期與請求處理管道的生命周期密切相關(guān)。中間件的實例化、配置、執(zhí)行和清理都是在應(yīng)用程序啟動、運行和結(jié)束時發(fā)生的,這確保了中間件能夠有效地參與到整個請求處理的過程中。

2.3 中間件的順序和影響

中間件的順序?qū)SP.NET Core應(yīng)用程序的行為有著重要的影響。中間件的執(zhí)行順序由其在Startup.cs文件的Configure方法中的注冊順序決定。以下是中間件順序?qū)?yīng)用程序的影響的一些方面:

  1. 執(zhí)行順序影響請求處理流程:
    • 中間件按照它們在Configure方法中注冊的順序執(zhí)行。因此,中間件的執(zhí)行順序直接影響整個請求處理流程。在請求處理過程中,每個中間件都有機會處理請求或者將請求傳遞給下一個中間件。
  2. 中間件的順序決定功能的應(yīng)用順序:
    • 如果應(yīng)用程序中有多個中間件用于不同的功能,它們的順序會決定這些功能的應(yīng)用順序。例如,身份驗證中間件可能需要在路由中間件之前執(zhí)行,以確保用戶身份驗證在路由之前完成。
  3. 中間件的順序影響請求和響應(yīng)的修改:
    • 中間件按照注冊的順序依次執(zhí)行,每個中間件都可以對請求和響應(yīng)進行修改。如果有多個中間件對同一部分請求或響應(yīng)進行修改,后注冊的中間件可能會覆蓋先注冊的中間件的修改。
  4. 中間件的順序決定中斷請求的時機:
    • 如果某個中間件決定中斷請求的處理流程,即不再將請求傳遞給后續(xù)中間件,那么它的位置在中間件鏈中將決定中斷的時機。如果這個中間件位于鏈的開始,那么請求可能在整個處理流程的早期被中斷。
  5. 影響性能:
    • 中間件的執(zhí)行順序也可能影響應(yīng)用程序的性能。例如,某些性能優(yōu)化的中間件可能需要在其他中間件之前執(zhí)行,以確保它們的性能增益得以應(yīng)用。
  6. 中間件順序的靈活性:
    • ASP.NET Core提供了中間件注冊的靈活性,開發(fā)者可以通過簡單的調(diào)整Startup.cs文件中的Configure方法中的中間件注冊順序來改變應(yīng)用程序的行為。這種靈活性使得開發(fā)者可以根據(jù)具體需求輕松地調(diào)整中間件的執(zhí)行順序。

中間件的順序在ASP.NET Core中起著關(guān)鍵的作用,開發(fā)者應(yīng)當(dāng)根據(jù)應(yīng)用程序的需求和功能的依賴關(guān)系來合理安排中間件的注冊順序。

三、內(nèi)置中間件的示例

3.1 靜態(tài)文件中間件

靜態(tài)文件中間件是ASP.NET Core中的一個內(nèi)置中間件,用于提供對靜態(tài)文件(如HTML、CSS、JavaScript、圖像等)的服務(wù),使它們能夠被直接訪問,而無需通過應(yīng)用程序邏輯。以下是一個簡單的Startup.cs文件,演示如何配置和使用靜態(tài)文件中間件:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 這里可以配置其他的服務(wù)
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        // 配置靜態(tài)文件中間件
        app.UseStaticFiles();

        // 這里可以配置其他中間件

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

在上述示例中,主要關(guān)注以下幾點:

  1. app.UseStaticFiles(); 這一行配置了靜態(tài)文件中間件。它告訴應(yīng)用程序在處理請求時,嘗試查找并提供靜態(tài)文件。
  2. app.UseMvc(...); 這里配置了MVC中間件,用于處理動態(tài)路由和控制器的邏輯。靜態(tài)文件中間件通常在MVC中間件之前注冊,以確保靜態(tài)文件的請求不會被MVC處理。

上述配置使得應(yīng)用程序能夠在根目錄下找到并提供靜態(tài)文件,例如 wwwroot 文件夾中的文件。在實際應(yīng)用中,你可以根據(jù)需要添加更多的配置,以適應(yīng)具體的應(yīng)用程序結(jié)構(gòu)和需求。

3.2 路由中間件

路由中間件是ASP.NET Core中的一個內(nèi)置中間件,用于實現(xiàn)URL路由,將傳入的請求映射到相應(yīng)的處理程序。以下是一個簡單的Startup.cs文件,演示如何配置和使用路由中間件:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 這里可以配置其他的服務(wù)
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        // 配置路由中間件
        app.UseRouting();

        // 這里可以配置其他中間件

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

在上述示例中,主要關(guān)注以下幾點:

  1. app.UseRouting(); 這一行配置了路由中間件。它告訴應(yīng)用程序在處理請求時,使用路由來決定請求應(yīng)該由哪個控制器和操作處理。
  2. app.UseEndpoints(...); 這里配置了終結(jié)點中間件,用于處理端點,如控制器和視圖。MapControllerRoute方法定義了默認(rèn)的路由規(guī)則,指定了控制器、操作和可選的ID參數(shù)。

上述配置使得應(yīng)用程序能夠根據(jù)URL路由請求到相應(yīng)的控制器和操作,以執(zhí)行相應(yīng)的邏輯。在實際應(yīng)用中,你可以根據(jù)需要調(diào)整路由規(guī)則,添加自定義路由規(guī)則以滿足應(yīng)用程序的需求。

3.3 認(rèn)證中間件

認(rèn)證中間件是ASP.NET Core中的一個內(nèi)置中間件,用于處理用戶身份驗證。以下是一個簡單的Startup.cs文件,演示如何配置和使用認(rèn)證中間件:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 添加身份驗證服務(wù)
        services.AddAuthentication("MyAuthenticationScheme")
            .AddCookie("MyAuthenticationScheme", options =>
            {
                options.Cookie.Name = "MyAuthCookie";
                options.LoginPath = "/Account/Login"; // 登錄頁面的路徑
            });

        // 這里可以配置其他的服務(wù)
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        // 配置身份驗證中間件
        app.UseAuthentication();

        // 這里可以配置其他中間件

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

在上述示例中,主要關(guān)注以下幾點:

  1. services.AddAuthentication(...) 這一行配置了身份驗證服務(wù),指定了身份驗證方案的名稱為"MyAuthenticationScheme"。可以根據(jù)需要添加多個身份驗證方案。
  2. .AddCookie(...) 在身份驗證服務(wù)中添加了Cookie認(rèn)證方案,可以使用Cookie來進行身份驗證。配置了Cookie的一些選項,如Cookie的名稱和登錄頁面的路徑。
  3. app.UseAuthentication(); 這一行配置了身份驗證中間件。它告訴應(yīng)用程序在處理請求時,使用身份驗證來驗證用戶的身份。

上述配置使得應(yīng)用程序能夠使用Cookie進行用戶身份驗證。在實際應(yīng)用中,你可以根據(jù)需要選擇其他身份驗證方案,如OAuth、OpenID Connect等,并配置相應(yīng)的選項。

四、創(chuàng)建自定義中間件

4.1 創(chuàng)建中間件的步驟

創(chuàng)建中間件涉及幾個主要步驟。以下是創(chuàng)建中間件的一般步驟:

  1. 創(chuàng)建中間件類:
    首先,創(chuàng)建一個C#類,該類將充當(dāng)中間件。這個類需要實現(xiàn)IMiddleware接口或者定義一個包含InvokeAsync方法的類。InvokeAsync方法是中間件執(zhí)行時實際調(diào)用的方法。
public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 中間件邏輯
        await context.Response.WriteAsync("Hello from MyMiddleware!");

        // 將請求傳遞給下一個中間件(或終端處理程序)
        await _next(context);
    }
}
  1. 注冊中間件:
    Startup.cs文件的Configure方法中,使用app.UseMiddleware()方法注冊中間件。確保在UseMiddleware中傳遞中間件類的類型。
public void Configure(IApplicationBuilder app)
{
    // 其他中間件配置

    app.UseMiddleware<MyMiddleware>();

    // 其他中間件配置
}
  1. 中間件構(gòu)造函數(shù)參數(shù):
    如果中間件需要訪問其他服務(wù)或組件,可以通過構(gòu)造函數(shù)參數(shù)注入它們。例如,可以注入ILogger<MyMiddleware>來進行日志記錄。
public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<MyMiddleware> _logger;

    public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 中間件邏輯
        _logger.LogInformation("Executing MyMiddleware");

        // 將請求傳遞給下一個中間件(或終端處理程序)
        await _next(context);
    }
}
  1. 中間件執(zhí)行順序:
    確保Configure方法中的app.UseMiddleware()調(diào)用的順序是按照需要的執(zhí)行順序。中間件的執(zhí)行順序通常很重要,因此確保它們在管道中的位置是正確的。
  2. 中間件的配置選項:
    如果中間件需要配置選項,可以在Startup.cs文件的ConfigureServices方法中進行配置。
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyMiddlewareOptions>(Configuration.GetSection("MyMiddleware"));
}

然后,在中間件類的構(gòu)造函數(shù)中注入配置選項。

public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<MyMiddleware> _logger;
    private readonly MyMiddlewareOptions _options;

    public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger, IOptions<MyMiddlewareOptions> options)
    {
        _next = next;
        _logger = logger;
        _options = options.Value;
    }

    // ...
}

這些步驟將幫助你創(chuàng)建和注冊自定義中間件,以在ASP.NET Core應(yīng)用程序中添加特定的功能和邏輯。

4.2 中間件的參數(shù)和配置

中間件可以接受構(gòu)造函數(shù)參數(shù)以及配置選項,這樣可以使中間件更加靈活和可配置。以下是中間件參數(shù)和配置的一般方式:

  1. 構(gòu)造函數(shù)參數(shù):
    中間件的構(gòu)造函數(shù)可以接受依賴項,例如日志記錄器、配置服務(wù)、其他服務(wù)等。這些參數(shù)可以通過構(gòu)造函數(shù)注入來獲取。
public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<MyMiddleware> _logger;

    public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 中間件邏輯
        _logger.LogInformation("Executing MyMiddleware");

        // 將請求傳遞給下一個中間件(或終端處理程序)
        await _next(context);
    }
}
  1. 配置選項:
    如果中間件需要配置選項,可以通過IOptions<T>接口注入。首先,在Startup.cs文件的ConfigureServices方法中配置選項。
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyMiddlewareOptions>(Configuration.GetSection("MyMiddleware"));
}

然后,在中間件類的構(gòu)造函數(shù)中注入配置選項。

public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<MyMiddleware> _logger;
    private readonly MyMiddlewareOptions _options;

    public MyMiddleware(RequestDelegate next, ILogger<MyMiddleware> logger, IOptions<MyMiddlewareOptions> options)
    {
        _next = next;
        _logger = logger;
        _options = options.Value;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 中間件邏輯
        _logger.LogInformation($"Executing MyMiddleware with OptionA: {_options.OptionA}");

        // 將請求傳遞給下一個中間件(或終端處理程序)
        await _next(context);
    }
}

MyMiddlewareOptions是一個簡單的POCO類,用于存儲配置選項。

public class MyMiddlewareOptions
{
    public string OptionA { get; set; }
    public int OptionB { get; set; }
}
  1. 在Startup中注冊中間件和配置:
    Startup.cs文件的ConfigureServicesConfigure方法中進行中間件和配置的注冊。
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyMiddlewareOptions>(Configuration.GetSection("MyMiddleware"));
}

public void Configure(IApplicationBuilder app)
{
    // 配置中間件
    app.UseMiddleware<MyMiddleware>();

    // 其他中間件配置
}

這樣,你就可以在中間件中使用構(gòu)造函數(shù)參數(shù)和配置選項,使中間件更具靈活性和可配置性。

4.3 示例:日志記錄中間件

以下是一個簡單的示例,展示如何創(chuàng)建一個自定義的日志記錄中間件。這個中間件將在每個請求到達(dá)時記錄請求的信息。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;

public class RequestLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggingMiddleware> _logger;

    public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
    {
        _next = next ?? throw new ArgumentNullException(nameof(next));
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 記錄請求信息
        LogRequest(context.Request);

        // 調(diào)用下一個中間件或處理程序
        await _next(context);

        // 這里也可以記錄響應(yīng)信息
        LogResponse(context.Response);
    }

    private void LogRequest(HttpRequest request)
    {
        var stringBuilder = new StringBuilder();

        stringBuilder.AppendLine("Incoming Request:");
        stringBuilder.AppendLine($"Path: {request.Path}");
        stringBuilder.AppendLine($"Method: {request.Method}");

        // 記錄請求頭
        stringBuilder.AppendLine("Headers:");
        foreach (var (key, value) in request.Headers)
        {
            stringBuilder.AppendLine($"{key}: {value}");
        }

        // 記錄請求體
        stringBuilder.AppendLine("Body:");
        request.EnableBuffering();
        using (var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
        {
            var requestBody = reader.ReadToEnd();
            stringBuilder.AppendLine(requestBody);
            request.Body.Position = 0; // 重置請求體位置,以確保后續(xù)中間件或處理程序仍然可以讀取它
        }

        _logger.LogInformation(stringBuilder.ToString());
    }

    private void LogResponse(HttpResponse response)
    {
        // 這里可以記錄響應(yīng)信息,視需求而定
    }
}

public static class RequestLoggingMiddlewareExtensions
{
    public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestLoggingMiddleware>();
    }
}

在上述示例中,RequestLoggingMiddleware類實現(xiàn)了InvokeAsync方法,該方法在每個請求到達(dá)時被調(diào)用。它記錄請求的路徑、方法、頭部和主體等信息,并通過ILogger進行日志記錄。為了方便使用,還提供了一個擴展方法UseRequestLogging,用于在Startup.cs文件中更容易地注冊該中間件。

public class Startup
{
    // ...

    public void Configure(IApplicationBuilder app)
    {
        // ...

        // 注冊自定義日志記錄中間件
        app.UseRequestLogging();

        // 其他中間件配置
    }
}

這樣,每次請求到達(dá)時,該中間件將記錄請求信息。請根據(jù)實際需求進行適當(dāng)?shù)恼{(diào)整和擴展。

五、最佳實踐和注意事項

在使用中間件時,有一些最佳實踐和注意事項可以幫助確保應(yīng)用程序的可維護性、性能和安全性。以下是一些常見的最佳實踐和注意事項:

5.1 最佳實踐:
  1. 良好的命名和結(jié)構(gòu):
    • 給中間件和相關(guān)類使用清晰、描述性的命名。
    • 結(jié)構(gòu)化中間件以便于維護和理解。
  2. 單一職責(zé):
    • 中間件應(yīng)當(dāng)遵循單一職責(zé)原則,每個中間件應(yīng)負(fù)責(zé)一個明確定義的任務(wù)。
    • 避免在一個中間件中處理過多的功能。
  3. 日志記錄:
    • 使用日志記錄來記錄中間件的關(guān)鍵活動,以便于故障排除和監(jiān)控。
    • 日志應(yīng)當(dāng)包含有關(guān)請求和響應(yīng)的重要信息。
  4. 錯誤處理:
    • 對于可能發(fā)生的錯誤進行適當(dāng)?shù)奶幚?,并生成有意義的錯誤消息。
    • 使用全局錯誤處理中間件處理未捕獲的異常。
  5. 測試:
    • 編寫單元測試以驗證中間件的正確性。
    • 使用集成測試確保中間件與其他組件正確協(xié)同工作。
  6. 版本控制:
    • 使用版本控制系統(tǒng),確保中間件的變更可以追溯和回滾。
  7. 文檔:
    • 提供良好的文檔,描述中間件的作用、配置選項和使用方式。
    • 文檔應(yīng)當(dāng)清晰地說明中間件的預(yù)期行為。
5.2 注意事項:
  1. 中間件順序:
    • 中間件的執(zhí)行順序很重要,確保它們按照正確的順序注冊。
    • 避免在中間件鏈中產(chǎn)生死循環(huán)。
  2. 資源釋放:
    • 如果中間件使用了非托管資源,確保在適當(dāng)?shù)臅r候釋放這些資源,以避免內(nèi)存泄漏。
  3. 性能影響:
    • 注意中間件可能對性能的影響,特別是在中間件鏈較長的情況下。
    • 避免不必要的中間件,只添加必需的功能。
  4. 異步操作:
    • 如果可能,使用異步中間件以提高應(yīng)用程序的吞吐量。
    • 確保異步操作的正確性和異常處理。
  5. 安全性:
    • 中間件應(yīng)該實施適當(dāng)?shù)陌踩源胧?,以防范潛在的攻擊?/li>
    • 避免在中間件中處理敏感信息,尤其是在不安全的環(huán)境中。
  6. 適應(yīng)性:
    • 考慮應(yīng)用程序的需求,選擇合適的內(nèi)置中間件或創(chuàng)建適用于特定場景的自定義中間件。

通過遵循這些最佳實踐和注意事項,可以幫助確保中間件在應(yīng)用程序中發(fā)揮良好的作用,并具有良好的可維護性和性能。

六、總結(jié)

ASP.NET Core中間件是請求處理管道中的組件,通過注冊和配置中間件,開發(fā)者可以定義請求處理的流程。中間件包括內(nèi)置和自定義兩類,用于實現(xiàn)不同功能,如路由、靜態(tài)文件服務(wù)和身份驗證。創(chuàng)建中間件的步驟包括編寫中間件類、注冊中間件和處理構(gòu)造函數(shù)參數(shù)和配置選項。在使用中間件時,應(yīng)遵循最佳實踐,確保良好的命名、單一職責(zé)、日志記錄、錯誤處理、測試、版本控制和文檔。注意事項包括中間件順序、資源釋放、性能影響、異步操作、安全性和適應(yīng)性。通過這些實踐和注意事項,可以構(gòu)建可維護、高性能和安全的ASP.NET Core應(yīng)用程序。文章來源地址http://www.zghlxwxcb.cn/news/detail-794828.html

到了這里,關(guān)于【ASP.NET Core 基礎(chǔ)知識】--中間件--什么是中間件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 如何在 ASP.NET Core 配置請求超時中間件

    如何在 ASP.NET Core 配置請求超時中間件

    本文參考官方文檔,使用Asp.net core 8.0 的最小API 模板項目,配置超時中間件。 超時中間件可用于所有類型的ASP.NET Core應(yīng)用:最小 API、帶控制器的 Web API、MVC 和 Razor Pages。請求超時的屬性位于命名空間 Microsoft.AspNetCore.Http.Timeouts 中。 需要注意的是,當(dāng)應(yīng)用在調(diào)試模式下運行時

    2024年01月20日
    瀏覽(93)
  • asp.net core中間件預(yù)防防止xss攻擊

    上面實現(xiàn)思路是針對json序列化后的string字符串進行編碼防止xss攻擊 其他實現(xiàn)比如中間件、Action的AOP方法也是可以的,可以自己實現(xiàn) 主要是看web項目使用的是那個json序列化工具newtonsoft就用newtonsoft,system.text.json就用下面的那個

    2024年02月07日
    瀏覽(21)
  • 1.ASP.NET Core中間件管道MAP的作用?

    簡述: Map基于給定請求路徑的匹配項來創(chuàng)建請求管道分支。可以針對不同的路徑添加不同的中間件。 詳解: 中間件是組裝到應(yīng)用程序管道中以處理請求和響應(yīng)的軟件組件。 每個組件都選擇是否將請求傳遞給管道中的下一個組件,并可以在管道中調(diào)用下一個組件之前和之后執(zhí)

    2024年02月17日
    瀏覽(21)
  • .net 溫故知新【17】:Asp.Net Core WebAPI  中間件

    .net 溫故知新【17】:Asp.Net Core WebAPI 中間件

    到這篇文章為止,關(guān)于.NET \\\"溫故知新\\\"系列的基礎(chǔ)知識就完結(jié)了,從這一系列的系統(tǒng)回顧和再學(xué)習(xí),對于.NET core、ASP.NET CORE又有了一個新的認(rèn)識。 不光是從使用,還包括這些知識點的原理,雖然深入原理談不上,但對于日常使用也夠了,我想的是知其然,知其所以然。 在實際

    2024年01月18日
    瀏覽(96)
  • ASP.NET Core如何知道一個請求執(zhí)行了哪些中間件?

    ASP.NET Core如何知道一個請求執(zhí)行了哪些中間件?

    需要添加兩個Nuget包分別是: Microsoft.AspNetCore.MiddlewareAnalysis 和 Microsoft.Extensions.DiagnosticAdapter ,前者是分析記錄中間件核心代碼實現(xiàn)后者是用來接收日志輸出的,由于是用的DiagnosticSource方式記錄日志,所以需要使用DiagnosticListener對象的SubscribeWithAdapter方法來訂閱。 這個適配器

    2023年04月09日
    瀏覽(101)
  • ASP.NET Core 的 Web Api 實現(xiàn)限流 中間件

    ASP.NET Core 的 Web Api 實現(xiàn)限流 中間件

    Microsoft.AspNetCore.RateLimiting ?中間件提供速率限制(限流)中間件。 它是.NET 7 以上版本才支持的中間件,剛看了一下,確實挺好用,下面給大家簡單介紹一下: RateLimiterOptionsExtensions?類提供下列用于限制速率的擴展方法:????? 固定窗口限制器 滑動窗口限制器 令牌桶限

    2024年01月17日
    瀏覽(18)
  • asp.net core 一種基于token 和 Permission 的權(quán)限管理中間件示例

    asp.net core 一種基于token 和 Permission 的權(quán)限管理中間件示例

    asp.net core webapi 下面,想做一個過濾權(quán)限的Filter,配合token,對api做一個較為細(xì)粒度的權(quán)限控制, 該filter (PermissionFilter) 的作用是用戶LoginUser.Permissions 列表中有 Key指定的權(quán)限才可以訪問,沒有則返回403 錯誤碼。 ? 1. 先上封裝后的使用效果 說明:要求登錄即可,不要求特定權(quán)限

    2024年02月05日
    瀏覽(22)
  • 精通中間件測試:Asp.Net Core實戰(zhàn)指南,提升應(yīng)用穩(wěn)定性和可靠性

    精通中間件測試:Asp.Net Core實戰(zhàn)指南,提升應(yīng)用穩(wěn)定性和可靠性

    在上一章節(jié)我們實戰(zhàn)了在 Asp.Net Core 中的項目實戰(zhàn),這一章節(jié)講解一下如何測試 Asp.Net Core 的中間件。 還記得我們在集成測試中提供的 TestServer 嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。包含了用于在測試環(huán)境中模擬 ASP.NET Core 應(yīng)用程序的類和方法。通過使用 TestSe

    2024年04月22日
    瀏覽(35)
  • 「中間件」rabbitmq 消息隊列基礎(chǔ)知識

    RabbitMQ是一個消息隊列軟件,用于在應(yīng)用程序之間轉(zhuǎn)發(fā)消息。以下是RabbitMQ的基本概念: 消息:RabbitMQ中的消息是傳遞的基本單位,它由消息頭和消息體組成。 隊列(Queue):隊列是消息的緩沖區(qū),用于存儲待處理的消息。 交換器(Exchange):交換器是接收生產(chǎn)者發(fā)送的消息并

    2024年02月07日
    瀏覽(97)
  • 網(wǎng)絡(luò)安全基礎(chǔ)知識&中間件簡單介紹

    網(wǎng)絡(luò)安全基礎(chǔ)知識&中間件簡單介紹

    apache-httpd tomcat iis lighttp nginx:不是用來web服務(wù)器,而是用來做反向代理(tps10w,優(yōu)化tqs2020w) fastdf:FastDFS 是一個開源的高性能分布式文件系統(tǒng)(DFS)。 它的主要功能包括:文件存儲,文件同步和文件訪問,以及高容量和負(fù)載平衡。主要解決了海量數(shù)據(jù)存儲問題,特別適合以

    2023年04月16日
    瀏覽(80)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包