詳解在ASP.NET Core中如何編寫合格的中間件
這篇文章探討了讓不同的請求去使用不同的中間件,那么我們應(yīng)該如何配置ASP.NET Core中間件?其實(shí)中間件只是在ASP.NET Core中處理Web請求的管道。所有ASP.NET Core應(yīng)用程序至少需要一個中間件來響應(yīng)請求,并且您的應(yīng)用程序?qū)嶋H上只是中間件的集合。當(dāng)然MVC管道本身就是中間件,早在WebForm時代就出現(xiàn)過HttpModules、HttpHandler、那個時候悠然記得我通過它們來組織我的廣告系統(tǒng),不閑扯我們繼續(xù)。
每個中間件組件都有一個帶有HttpContext參數(shù)的Invoke方法。您可以使用這個參數(shù)來處理方法。
public async Task Invoke(HttpContext context)
{
if (context.Request.Path...)
{
await context.Response.WriteAsync("writing text...");
}
}
應(yīng)用程序中最頂層的中間件將始終針對每個請求被調(diào)用。這是由.NET框架自動完成的。中間件可以向客戶端發(fā)送響應(yīng),也可以調(diào)用下一個中間件。對于后一種選擇,它當(dāng)然需要訪問下一個中間件組件。這就是為什么大多數(shù)中間件組件都是使用帶有RequestDelegate參數(shù)的構(gòu)造函數(shù)定義的??傊?,RequestDelegate會自動填充,您無需在意。
中間件在Startup.cs的Configure方法中注冊。Configure方法具有IApplicationBuilder參數(shù),該參數(shù)提供了所有類型的中間件注冊所需的方法,我們試著去編寫一個中間件。
public class MyCustomMiddleware
{
private readonly RequestDelegate _next;
public MyCustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context, IWebHostEnvironment env)
{
context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet";
context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet";
await _next(context);
}
}
隨后我們在Startup.cs的Configure方法中通過 use 來注冊自定義中間件。
public void Configure(IApplicationBuilder app, ...)
{
app.UseMyCustomMiddleware();
}
啟動程序我們發(fā)現(xiàn)一些正常,我們得到了我們想要的效果。
但實(shí)際上,您很少需要直接調(diào)用UseMiddleware,因?yàn)橹虚g件作者的標(biāo)準(zhǔn)方法是編寫特定于所注冊中間件的擴(kuò)展方法:
using MiddlerWareSolucation.MiddlerWare;
using Microsoft.AspNetCore.Builder;
namespace MiddlerWareSolucation.MiddlerWare_Extensions
{
public static class MyCustomMiddlewareExtensions
{
public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<MyCustomMiddleware>();
return app;
}
}
}
隨后直接調(diào)用Extensions擴(kuò)展方法,效果還是一樣的。
public void Configure(IApplicationBuilder app, ...)
{
app.UseMyCustomMiddleware();
}
部分時候我們想要通過客戶端請求的路徑來對我們的中間件進(jìn)行啟動,當(dāng)然 MapWhen 允許您通過指定謂詞將中間件管道分成兩個完全獨(dú)立的分支:
app.UseMiddlewareOne();
app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseMiddlewareTwo();
});
app.UseMiddlewareThree();
在此示例中,中間件One將始終執(zhí)行,如果請求路徑以“ / api”開頭,則將執(zhí)行中間件Two。否則,將執(zhí)行中間件Three。使用這種配置,中間件2和中間件3都無法針對單個請求執(zhí)行。
我想說的是最后一種情況是,您希望大多數(shù)中間件針對所有請求運(yùn)行,但是您有一些條件件-特定中間件僅應(yīng)針對某些請求運(yùn)行。
這可以通過UseWhen輕松實(shí)現(xiàn),UseWhen還使用謂詞來確定中間件是否應(yīng)該運(yùn)行:
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");
appBuilder.UseExceptionHandler("/apierror/500");
});
這樣就可以通過選擇注冊方式來自己控制中間件。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Visual Studio 2012 Update 4 RC啟動調(diào)試失敗的方案
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2012 Update 4 RC啟動調(diào)試失敗的解決方案,感興趣的小伙伴們可以參考一下2016-05-05
使用FreeHost SQL2000網(wǎng)頁管理器出錯解決辦法
在您登陸FreeHost SQL2000網(wǎng)頁管理器時,如果提示以下信息: 發(fā)生類型為 System.Web.HttpUnhandledException 的異常2012-01-01
Asp.Net數(shù)據(jù)控件引用AspNetPager.dll分頁實(shí)現(xiàn)代碼
今天與大家分享一下“Asp.Net數(shù)據(jù)控件引用AspNetPager.dll分頁”首先聲明以下幾點(diǎn)2012-01-01
asp.net實(shí)現(xiàn)中英文多域名檢測的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)中英文多域名檢測的方法,涉及asp.net針對URL中域名的解析及字符串操作相關(guān)技巧,需要的朋友可以參考下2016-08-08

