日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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四个扩展方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。