dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
什么是中間件
中間件是在管道中處理Request請求與Responses響應的一種組件,每種組件可以選擇是否讓Request進入到下一個組件去處理。
譯得不好,大家可以自己看原文Middleware
更詳細的還可以參照園中大神的作品;
有湯姆大叔的解讀ASP.NET 5 & MVC6系列(6):Middleware詳解?
artech大神的?ASP.NET Core真實管道詳解[1]:中間件是個什么東西?
怎么創建一個Middleware請參考英文文檔Middleware?或者
LineZero的?ASP.NET Core 開發-中間件(Middleware)
要正確使用Middleware來構建自己的應該程序,需要理解Run,Use,Map,MapThen這四個方法是如何使用的, 下面Ricman將自己的理解與大家分享。
一、Run擴展方法
Run方法在說明上是這樣的:在管道的尾端增加一個Middleware;它是執行的最后一個Middleware。即它執行完就不再執行下一個Middleware了。如下代碼示例。
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug(); ? ? ?? ? ? ? ? ?var loger = loggerFactory.CreateLogger("TestLogger"); ? ? ? ? ?//第一個Run 執行了app.Run(async context =>{loger.LogInformation("run 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,run 1");loger.LogInformation("run 1 end");}); ? ? ? ? ? ?//第二個Run 沒的執行app.Run(async context =>{loger.LogInformation("run 2 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,run 2");loger.LogInformation("run 2 end");});}
輸出的結果為:
只打印出了第一個Run中的內容。而程序也不會響應第二個Run方法中的內容。?
二、Use擴展方法
Use方法,則是在管道中增加一個Middleware。如果調用了next.Invoke()方法,它會去執行下一個Middleware 。我們把上面的例子稍作修改:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug(); ? ? ?? ? ?var loger = loggerFactory.CreateLogger("TestLogger"); ? ? ? ? ?//use 方法 執行了app.Use (async (context,next) =>{loger.LogInformation("Use 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,Use 1");loger.LogInformation("Use 1 end");}); ? ? ? ? ? ?//Run 方法沒的執行app.Run(async context =>{loger.LogInformation("run 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,run 1");loger.LogInformation("run 1 end");});}
輸出結果是什么?
沒有調用next.Invoke();尾端的Middleware即Run方法內沒有執行。使用Use方法,而沒有調用next.Invoke(),Use的效果與Run的效果是一致的。為了驗證Use 的效果,我們再修改代碼。
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug(); ? ? ? ?? ?var loger = loggerFactory.CreateLogger("TestLogger"); ? ? ? ? ?//執行了app.Use (async (context,next) =>{loger.LogInformation("Use 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,Use "); ? ? ? ? ? ? ? ?await next.Invoke();loger.LogInformation("Use 1 end");}); ? ? ? ? ? ?//沒的執行app.Run(async context =>{loger.LogInformation("run 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync(" ?hello world!,run ");loger.LogInformation("run 1 end");});}
此時,輸入以下的結果
即Use與Run代碼段都被執行了。需要注意的是,管道中可以增加多個middleware,他們是按順序執行的,執行的順序與在Configure方法中代碼的順序是一致的。
三、Map與MapThen
Map比較不同,它將Middleware添加到管道中,它是在管道中增加了分支。通過影射路徑的方式,增加管道分支。我們保留上面例子,并增加代碼。如下:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug(); ? ? ? ?? ? ? ? ? ?var loger = loggerFactory.CreateLogger("TestLogger"); ? ? ? ? ?//執行了app.Use (async (context,next) =>{loger.LogInformation("Use 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,Use "); ? ? ? ? ? ? ? ?await next.Invoke();loger.LogInformation("Use 1 end");});app.Map("/mapTest", HandleMap); ? ? ? ? ? ?//沒的執行app.Run(async context =>{loger.LogInformation("run 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync(" ?hello world!,run ");loger.LogInformation("run 1 end");});} ? ? ? ?private static void HandleMap(IApplicationBuilder app){app.Run(async context =>{ ? ? ? ? ? ? ? ?await context.Response.WriteAsync("Hello ,that is Handle Map ");});}
運行起來,我們在瀏覽器中輸入”?http://localhost:12716/mapTest” 得到的結果如下:
mapTest分支被執行了。
MapThen就更有意思,從字面上感覺有點類似查詢的意思。對了。它就是處理符合條件的Request去執行給定的方法。我們修改代碼
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug(); ? ?? ? ? ? ? ?var loger = loggerFactory.CreateLogger("TestLogger"); ? ? ? ? ?//執行了app.Use (async (context,next) =>{loger.LogInformation("Use 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync("hello world!,Use "); ? ? ? ? ? ? ? ?await next.Invoke();loger.LogInformation("Use 1 end");});app.MapWhen(context =>{ return context.Request.Query.ContainsKey("q"); }, HandleQuery); ? ? ? ? ? ?//沒的執行app.Run(async context =>{loger.LogInformation("run 1 start"); ? ? ? ? ? ? ? ?await context.Response.WriteAsync(" ?hello world!,run ");loger.LogInformation("run 1 end");});} private static void HandleQuery(IApplicationBuilder app){app.Run(async context =>{ ? ? ? ? ? ? ? ? ? await context.Response.WriteAsync(" ?Hello ,this is Handle Query ");});}
我們要處理的是:如果有URL中的參數包含了q字母的話,就去執行HandleQuery方法??匆幌陆Y果
?
可以看出來,MapWhen可以處理很多的東西,比如我們要處理Request表頭中某特定的內容,可以使用MapWhen來處理。
相關文章:
微軟.NET 正式劈腿成功,橫跨所有平臺
.NET Core 1.0 CentOS7 嘗試
解讀發布:.NET Core RC2 and .NET Core SDK Preview 1
[.NET Core].NET Core R2安裝及示例教程
ASP.NET Core 開發-中間件(Middleware)
結合Jexus + Kestrel 部署 asp.net core 生產環境
通過Jexus 部署 dotnetcore版本MusicStore 示例程序
ASP.NET Core 中文文檔 第一章 入門
用 Visual Studio Code 在 macOS 上創建首個 ASP.NET Core 應用程序
用 Visual Studio 和 ASP.NET Core MVC 創建首個 Web API
用 Visual Studio 發布一個 Azure 云 Web 應用程序
ASP.NET Core MVC 與 Visual Studio 入門
第二章指南(4.2)添加 Controller
DotNet Core 介紹
asp.net core 中間件詳解及項目實戰
教你實踐ASP.NET Core Authorization(免看文檔教程)
asp.net core 使用 Redis 和 Protobuf 進行 Session 緩存
asp.net core 中間件詳解及項目實戰
第二章 指南(4.3)添加 View
dotnet core開發體驗之開始MVC
dotnet core 開發體驗之Routing
聊聊ASP.NET Core默認提供的這個跨平臺的服務器——KestrelServer
簡析.NET Core 以及與 .NET Framework的關系
.NET Core 使用Dapper 操作MySQL
使用 CommandLineApplication 類創建專業的控制臺程序
簡析 .NET Core 構成體系
.NET Core也可以使用MongoDB了
.NET Core & ASP.NET Core 1.0在Redhat峰會上正式發布
.NET Core:面向未來的開源跨平臺開發技術
微軟說它深愛著Linux,現在它用行動證明了
移植.NET Core計劃,整合各平臺變得更簡單了!
ASP.NET Core 介紹
通過幾個Hello World感受.NET Core全新的開發體驗
ASP.NET Core 運行原理剖析1:初始化WebApp模版并運行
.NET Core系列 : 1、.NET Core 環境搭建和命令行CLI入門
Asp.Net Core 發布和部署( MacOS + Linux + Nginx )
Asp.Net Core 發布和部署(Linux + Jexus )
學習ASP.NET Core,你必須了解無處不在的“依賴注入”
.NET Core應用類型(Portable apps & Self-contained apps)
.NET Core 1.0發布:微軟開源跨平臺大布局序幕
ASP.NET Core 運行原理剖析2:Startup 和 Middleware(中間件)
在Windows Server 2012 R2 Standard 部署 ASP.NET Core程序
ASP.NET Core 開發-Entity Framework (EF) Core 1.0 Database First
擁抱.NET Core,跨平臺的輕量級RPC:Rabbit.Rpc
使用 dotnet watch 開發 ASP.NET Core 應用程序
ASP.NET Core 發布至Linux生產環境 Ubuntu 系統
ASP.NET Core Docker部署
ASP.NET Core "完整發布,自帶運行時" 到jexus
全球首發免費的MySql for Entity Framework Core
原文地址:http://www.cnblogs.com/xiaoshou/p/5669122.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL注入(SQL Injection)
- 下一篇: docker4dotnet #2 容器化