1. 程式人生 > 其它 >netcore 圖解及核心概念理解(部分摘錄)

netcore 圖解及核心概念理解(部分摘錄)

圖例

詳細說明:

一、啟動順序

1、程式啟動,執行main方法
2、建立web伺服器,啟動startup類
3、執行ConfigureServices,為程式配置可供重用的服務
4、執行Configure,配置中介軟體處理請求和響應

二、中介軟體

什麼是中介軟體

中介軟體是用於組成應用程式管道來處理請求和響應的元件。管道內的每一個元件都可以選擇是否將請求交給下一個元件、並在管道中呼叫下一個元件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個 HTTP 請求。 請求委託通過使用 IApplicationBuilder 型別的 Run、Map 以及 Use 擴充套件方法來配置,並在 Startup 類中傳給 Configure 方法 。每個單獨的請求委託都可以被指定為一個內嵌匿名方法,或其定義在一個可重用的類中。這些可重用的類被稱作 中介軟體 或 中介軟體元件。每個位於請求管道內的中介軟體元件負責呼叫管道中下一個元件,或適時短路呼叫鏈。 Migrating HTTP Modules to Middleware 解釋了請求管道在 ASP.NET Core 和之前版本之間的區別,並提供了更多中介軟體樣例。

用 IApplicationBuilder 建立中介軟體管道 ASP.NET 請求管道由一系列的請求委託所構成,它們一個接著一個被呼叫,如圖所示(該執行執行緒按黑色箭頭的順序執行):

每個委託在下一個委託之前和之後都有機會執行操作。任何委託都能選擇停止傳遞到下一個委託,轉而自己處理該請求。這被叫做請求管道的短路,而且是一種有意義的設計,因為它可以避免不必要的工作。比方說,一個授權(authorization)中介軟體只有在通過身份驗證之後才呼叫下一個委託,否則它就會被短路並返回 “Not Authorized” 的響應。異常處理委託需要在管道的早期被呼叫,這樣它們就能夠捕捉到發生在管道內更深層次出現的異常了。

Run,Map 與 Use 你可以使用 Run、Map 和 Use 配置 HTTP 管道。Run 方法將會短路管道(因為它不會呼叫 next 請求委託)。因此,Run 應該只能在你的管道尾部被呼叫。Run 是一種慣例,有些中介軟體元件可能會暴露他們自己的 Run[Middleware] 方法,而這些方法只能在管道末尾處執行。下面這兩個中介軟體等價的,其中有用到 Use 的版本沒有使用 next 引數:

public void ConfigureEnvironmentOne(IApplicationBuilder app)
{
    app.Run(async context =>//手工高亮
{ await context.Response.WriteAsync("Hello from " + _environment); }); }

public void ConfigureEnvironmentTwo(IApplicationBuilder app)
{
app.Use(
async (context, next) =>//手工高亮
{
await context.Response.WriteAsync("Hello from " + _environment);
});
}

Map擴充套件方法用於匹配基於請求路徑的請求委託。Map只接受路徑,並配置單獨的中介軟體管道的功能。在下例中,任何基於路徑/maptest的請求都會被管道中所配置的HandleMapTest方法所處理。

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app)
{
app.Map(
"/maptest", HandleMapTest);//手工高亮

}

編寫中介軟體

對於更復雜的請求處理功能,推薦在自己的類中實現中介軟體,並暴露IApplicationBuilder擴充套件方法,這樣就能通過Configure方法來被呼叫。之前演示的簡易日誌中介軟體就能被轉換為一箇中間件類(middleware class):只要在其建構函式中獲得下一個RequestDelegate並提供一個Invoke方法,如下所示:

中介軟體遵循顯式依賴原則並在其建構函式中暴露所有依賴項。中介軟體能夠利用到UseMiddleware擴充套件方法的優勢,直接通過它們的建構函式注入服務,就像下面的例子所示。依賴注入服務是自動完成填充的,擴充套件所用到的params引數陣列被用於非注入引數。

public static class RequestLoggerExtensions
{
    public static IApplicationBuilder UseRequestLogger(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestLoggerMiddleware>();
    }
}

通過使用擴充套件方法和相關中介軟體類,Configure方法變得非常簡潔和高可讀性。

儘管RequestLoggerMiddleware在其建構函式中需要ILoggerFactory引數,但無論是Startup類還是UseRequestLogger擴充套件方法都不需要顯式依賴之。相反,它將自動地通過內建的UseMiddleware<T>來執行依賴注入以提供之。

測試中介軟體(通過給LogMiddleware設定Hosting:Environment環境變數)會輸出下圖的結果(當時用了 WebListener 時):

注意
UseStaticFiles擴充套件方法(該方法會建立StaticFileMiddleware)同樣也使用了UseMiddleware<T>。所以除了StaticFileOptions引數被傳入之外,建構函式的其他引數都由UseMiddleware<T>和依賴注入所提供。

------------恢復內容結束------------