淺談ASP.NET Core 2.0 中間件(譯)
問題
如何創(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上的擴展方法:
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請求和響應(yīng)消息的組件。我們通過創(chuàng)建這些組件鏈,來為我們的應(yīng)用程序創(chuàng)建一個請求管道。
我們通過Configure()方法的IApplicationBuilder參數(shù)來創(chuàng)建這個請求管道,IApplicationBuilder參數(shù)有如下方法:
- Run():添加中間件并終止請求管道(也就是說不再調(diào)用下一個中間件)。
- Use():添加中間件,使用lambda表達式或者一個具體的類。
- 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封裝起來是最佳實踐。
擴展方法
需要注意擴展方法的不同之處,RunXXX不會返回值,而UseXXX會返回值(IApplicationBuilder)。這是因為Run()終止請求管道,而Use()可能會鏈接到其他的中間件。
順序
中間件按照它們在Configure()方法出現(xiàn)的順序依次被調(diào)用。而返回到客戶端的響應(yīng)也會經(jīng)歷相同的中間件管道。
原文:https://tahirnaushad.com/2017/08/14/asp-net-core-middleware/
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.NET 6開發(fā)TodoList應(yīng)用引入數(shù)據(jù)存儲
這篇文章主要介紹了.NET 6開發(fā)TodoList應(yīng)用引入數(shù)據(jù)存儲,本篇文章僅完成了數(shù)據(jù)存儲服務(wù)的配置工作,目前還沒有添加任何實體對象和數(shù)據(jù)庫表定義,所以暫時沒有可視化的驗證,僅我們可以運行程序看我們的配置是否成功:下面來看詳細內(nèi)容吧2021-12-12ASP.NET Core Web App應(yīng)用第三方Bootstrap模板的方法教程
這篇文章主要給大家介紹了關(guān)于ASP.NET Core Web App應(yīng)用第三方Bootstrap模板的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧2018-06-06Json數(shù)據(jù)轉(zhuǎn)換list對象實現(xiàn)思路及代碼
本文為大家詳細介紹下Json數(shù)據(jù)轉(zhuǎn)換list對象的具體實現(xiàn),感興趣的朋友可以參考下哈,希望對你有所幫助2013-04-04使用ajax局部刷新gridview進行數(shù)據(jù)綁定示例
很多用戶都有這樣需求,比如:點擊按鈕,刷新 GridView 中的數(shù)據(jù),而不是這個頁面刷新。使用簡單的 XMLHttpRequest就可以直接實現(xiàn)2014-02-02.net6環(huán)境下使用RestSharp請求GBK編碼網(wǎng)頁亂碼的解決方案
這篇文章介紹了.net6環(huán)境下使用RestSharp請求GBK編碼網(wǎng)頁亂碼的解決方案,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12.NET?Core控制臺應(yīng)用ConsoleApp讀取appsettings.json配置文件
這篇文章介紹了.NET?Core控制臺應(yīng)用ConsoleApp讀取appsettings.json配置文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07