中間件是用於組成應用程序管道來處理請求和響應的組件。管道內的每一個組件都可以選擇是否將請求交給下一個組件,並在管道中調用下一個組件之前和之後執行某些操作。請求委託被用來建立請求管道,請求委託處理每一個http請求。
請求委託通過使用IApplicationBuilder類型的Run、Map、以及Use擴展方法配置,並在Startup類中傳給Configure方法。
個人理解:中間件就像http請求一個mvc路由然後程序就返回一個怎樣響應,這寫代碼寫在Configure方法裏面。
例子一:無論頁面怎麼請求,就是返回Hello World!
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
例子二:run方法會使得請求在管路中短路Hello World2不會執行。
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World2");//不會顯示
});
例子三:next參數繼續執行請求
loggerFactory.AddConsole(minLevel: LogLevel.Information);
var logger = loggerFactory.CreateLogger("Middleware");
app.Use(async (context, next) =>
{
logger.LogInformation("Handling request.");
await next.Invoke();
logger.LogInformation("Finished handling request");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World");
});
例子四:,map方法:根據傳入map方法的參數進行請求返回
app.Map("/maptest", HandleMapTest);//只有請求路徑是maptest纔會執行HandleMapTest委託
private void HandleMapTest(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("map test success");
});
}
例子五:mapwhen用於地址欄的querystring參數的試用
app.MapWhen(context =>
{
return context.Request.Query.ContainsKey("branch");
}, HandleBranch);
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("brancb userd");
});
}
實戰中間件demo,可以在此處下載