您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關ASP.NET Core 2.0 中間件的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
問題
如何創建一個最簡單的ASP.NET Core中間件?
答案
使用VS創建一個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)"); }); }
比較好的創建請求管道的方法是使用IApplicationBuilder上的擴展方法:
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(); }
運行,此時頁面顯示:
上面我們使用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(); }
運行,此時頁面顯示:
將中間件作為單獨的類定義是更好的實踐方法:
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(); }
運行,此時頁面顯示:
討論
中間件是一個攔截HTTP請求和響應消息的組件。我們通過創建這些組件鏈,來為我們的應用程序創建一個請求管道。
我們通過Configure()方法的IApplicationBuilder參數來創建這個請求管道,IApplicationBuilder參數有如下方法:
Run():添加中間件并終止請求管道(也就是說不再調用下一個中間件)。
Use():添加中間件,使用lambda表達式或者一個具體的類。
Map():根據請求路徑添加中間件。
Run
這個方法接受RequestDelegate委托作為參數,當委托方法被調用時接受HttpContext參數。這個委托方法返回void,因為它會終止請求管道。
Use
這個方法接受Func委托作為參數,此委托方法有兩個參數,分別是HttpContext和指向下一個中間件的next,返回空(Task)。如果沒有調用下一個中間件,就會終止請求管道(和Run效果一樣)。
UserMiddleware
當通過單獨類創建中間件時,我們使用UseMiddleware方法,并將具體的實現類型作為泛型參數。
在中間件類中,有兩個部分很重要:
1. 構造函數接受RequestDelegate。當調用此委托時會將當前請求傳入下一個中間件。
2. 它擁有一個Invoke方法,接收HttpContext參數并返回空(Task)。當需要用到中間件時,框架會主動調用這個方法。
注:在單獨類中實現中間件,并用UseMiddleware封裝起來是最佳實踐。
擴展方法
需要注意擴展方法的不同之處,RunXXX不會返回值,而UseXXX會返回值(IApplicationBuilder)。這是因為Run()終止請求管道,而Use()可能會鏈接到其他的中間件。
順序
中間件按照它們在Configure()方法出現的順序依次被調用。而返回到客戶端的響應也會經歷相同的中間件管道。
感謝各位的閱讀!關于“ASP.NET Core 2.0 中間件的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。