溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET Core 2.0 中間件的示例分析

發(fā)布時間:2021-08-09 09:50:05 來源:億速云 閱讀:149 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)ASP.NET Core 2.0 中間件的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

問題

如何創(chuàng)建一個最簡單的ASP.NET Core中間件?

答案

使用VS創(chuàng)建一個ASP.NET Core 2.0的空項目,注意Startup.cs中的Configure()方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync("Hello World! (Run)");
  });
}

比較好的創(chuàng)建請求管道的方法是使用IApplicationBuilder上的擴(kuò)展方法:

public static void RunHelloWorld(this IApplicationBuilder app)
{
  app.Run(async (context) =>
  {
    await context.Response.WriteAsync("Hello World! (Run)");
  });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.RunHelloWorld();
}

運行,此時頁面顯示:

ASP.NET Core 2.0 中間件的示例分析

上面我們使用IApplicationBuilder.Run()來配置中間件,另外一種方法是IApplicationBuilder.Use():

public static void UseHelloWorld(this IApplicationBuilder app)
{
  app.Use(async (context, next) =>
  {
    await context.Response.WriteAsync("Hello World! (Use)\n");
    await next();
  });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseHelloWorld();
  app.RunHelloWorld();
}

運行,此時頁面顯示:

ASP.NET Core 2.0 中間件的示例分析

將中間件作為單獨的類定義是更好的實踐方法:

public class HelloWorldMiddleware
{
  private readonly RequestDelegate _next;

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

  public async Task Invoke(HttpContext context)
  {
    await context.Response.WriteAsync("Hello World! (Use in Class)\n");
    await _next(context);
  }
}


public static class UseHelloWorldInClassExtensions
{
  public static IApplicationBuilder UseHelloWorldInClass(this IApplicationBuilder app)
  {
    return app.UseMiddleware<HelloWorldMiddleware>();
  }
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseHelloWorld();
  app.UseHelloWorldInClass();
  app.RunHelloWorld();
}

運行,此時頁面顯示:

ASP.NET Core 2.0 中間件的示例分析

討論

中間件是一個攔截HTTP請求和響應(yīng)消息的組件。我們通過創(chuàng)建這些組件鏈,來為我們的應(yīng)用程序創(chuàng)建一個請求管道。

我們通過Configure()方法的IApplicationBuilder參數(shù)來創(chuàng)建這個請求管道,IApplicationBuilder參數(shù)有如下方法:

  1. Run():添加中間件并終止請求管道(也就是說不再調(diào)用下一個中間件)。

  2. Use():添加中間件,使用lambda表達(dá)式或者一個具體的類。

  3. Map():根據(jù)請求路徑添加中間件。

Run

這個方法接受RequestDelegate委托作為參數(shù),當(dāng)委托方法被調(diào)用時接受HttpContext參數(shù)。這個委托方法返回void,因為它會終止請求管道。

Use

這個方法接受Func委托作為參數(shù),此委托方法有兩個參數(shù),分別是HttpContext和指向下一個中間件的next,返回空(Task)。如果沒有調(diào)用下一個中間件,就會終止請求管道(和Run效果一樣)。

UserMiddleware

當(dāng)通過單獨類創(chuàng)建中間件時,我們使用UseMiddleware方法,并將具體的實現(xiàn)類型作為泛型參數(shù)。

在中間件類中,有兩個部分很重要:

1. 構(gòu)造函數(shù)接受RequestDelegate。當(dāng)調(diào)用此委托時會將當(dāng)前請求傳入下一個中間件。

2. 它擁有一個Invoke方法,接收HttpContext參數(shù)并返回空(Task)。當(dāng)需要用到中間件時,框架會主動調(diào)用這個方法。

注:在單獨類中實現(xiàn)中間件,并用UseMiddleware封裝起來是最佳實踐。

擴(kuò)展方法

需要注意擴(kuò)展方法的不同之處,RunXXX不會返回值,而UseXXX會返回值(IApplicationBuilder)。這是因為Run()終止請求管道,而Use()可能會鏈接到其他的中間件。

順序

中間件按照它們在Configure()方法出現(xiàn)的順序依次被調(diào)用。而返回到客戶端的響應(yīng)也會經(jīng)歷相同的中間件管道。

感謝各位的閱讀!關(guān)于“ASP.NET Core 2.0 中間件的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI