主頁 > .NET開發 > asp.net core 3.x Endpoint終結點路由1-基本介紹和使用

asp.net core 3.x Endpoint終結點路由1-基本介紹和使用

2020-09-19 05:46:55 .NET開發

前言

我是從.net 4.5直接跳到.net core 3.x的,感覺asp.net這套東西最初是從4.5中的owin形成的,
目前官方檔案重點是講路由,沒有特別說明與傳統路由的區別,本篇主要介紹終結點路由的相關概念和如何使用,不會詳細介紹路由,這個參考官方檔案就ok了,如果將來有機會研究到底層再深度剖析,

參考:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?view=aspnetcore-3.1
https://q.cnblogs.com/q/113644/ 
https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/

概述

最初我們訪問 http://www.abc.com/a.aspx時,服務端是存在a.aspx這個檔案的,服務端根據此檔案幫我們創建一個對應類的實體處理請求,
后來需求越來越復雜,出現了路由,目的是將請求地址與執行請求的處理器的直接關聯,變成映射關聯,映射規則由我們自己配置,
在asp.net core 3.x之前這個路由系統是包含在mvc內部的,.net framework時代有個特殊的HttpModule來實作mvc,路由系統也包含其中,.net core是由有個特殊的中間件來實作mvc的,路由系統就包含在這個中間件中,
這種方式有個問題,mvc只是一個中間件,路由系統包含在其中,如果我們希望在mvc中間件之后加入其它中間件,其它中間件是無法(也許是不方便)訪問路由相關資訊的,
另外asp.net core并不是只有mvc,還有webapi、blazor、signlR、接入gRpc等,將來還有更多,我們的路由系統能否提出來,讓所有框架都可以用?

因此出現了終結點路由,我們說路由的根本目的是將用戶請求地址,映射為一個請求處理器,最簡單的請求處理器可以是一個委托 Func<HttpCotnext,Task>,也可以是mvc/webapi中某個controller的某個action,所以從抽象的角度講 一個終結點 就是一個處理請求的委托,由于mvc中action上還有很多attribute,因此我們的終結點還應該提供一個集合,用來存盤與此請求處理委托的關聯資料,
從抽象的角度可以簡單理解為   一個終結點 = 處理請求的委托 + 與之關聯的附加(元)資料,對應到mvc來理解的話 終結點 = action + 應用其上的attribute集合,但記住終結點是個抽象的概念,并不只服務于mvc,原理大概如下:

  1. 在程式啟動前我們應該定義好程式中有哪些終結點,當然不是我們手動一個個定義,而是根據目標框架自動生成,針對mvc來說的話可以自動將程式中與路由匹配的action轉換成對應的終結點,其它框架應該也有對應的方式,反正最終我們所有用來處理請求的東東都變成了終結點,這步是在定義路由時自動完成的
  2. 除了定義終結點我們還要定義 請求路徑 與 終結點的對應關系,將來請求抵達時才能匹配找到合適的終結點來處理我們的請求,這步相當于定義路由
  3. 我們還需要定義一個決議器,當請求抵達時根據終結點與路徑的對應關系找到終結點,微軟已定義好對應的中間件來表示這個決議器,
  4. 最后我們需要定義一個中間件,在上面的中間件執行后 我們可以拿到與當前請求匹配的終結點,最終呼叫它的委托處理請求,這個中間件就是mvc中間件
  5. 到此asp.net core 3.x的中間件路由默認差不多就這樣了,此時我們可以定義自己的中間件,放在步驟3后面,拿到終結點做一些高級處理,微軟定義的一些中間件也是這個套路

如何使用

在通過vs默認模板創建asp.net core 3.x專案時,在startup中會看到這樣的代碼

1 app.UseRouting();2 app.UseEndpoints(endpoints => {3   endpoints.MapControllerRoute(4     name: "default",5     pattern: "{controller=Home}/{action=Index}/{id?}");6 });

注冊路由

看代碼的第2行,它有如下3個任務

  1. 創建終結點定義,針對mvc來說會自動將程式中與路由格式匹配上的action轉換為終結點,在第5行之后可以除錯觀察endpoints.DataSource屬性,生成好的終結點就在里面
  2. 建立url與終結點的對應關系,這種關系存在哪?我也不曉得
  3. 注冊mvc中間件(它在將來請求抵達,且之前有中間件決議得到與當前請求匹配的終結點后,開始mvc旅程)

這里路由跟以前的寫法差不多,上面默認值啊、約束啊就去看官方檔案吧,
創建終結點也會參照屬性路由,微軟推薦webapi使用屬性路由,mvc使用傳統路由,你會看到創建默認webapi專案時這樣的 endpoints.MapControllers(); 

終結點進一步定制

默認情況下是根據定義的路由去找到匹配的action最后生成終結點,這個生成終結點的程序我們是可以參與的,具體辦法是通過endpoints.MapControllerRoute的回傳物件上呼叫相關擴展方法,本質上是向終結點的創建程序加入一些委托,將來創建終結點時,這些委托將被呼叫,代碼如下:

1 endpoints.MapControllerRoute(2                     name: "default",3                     pattern: "{controller=Home}/{action=Index}/{id?}").Add(endpointBuilder=> {4                         //通過endpointBuilder獲取與action關聯的資料,比如attribute和其它元資料5                         //通過endpointBuilder插入我們向放進終結點的資料6                     });

動態路由

app.UseEndpointsmvc時就說明了使用mvc和webapi了,默認情況下一個action會創建一個對應的終結點,請求抵達時匹配到終結點就直接執行了,但有時候我們希望自己控制一個請求過來時使用哪個controller的哪個action,具體做法:
定義一個類,繼承DynamicRouteValueTransformer,并注冊到ioc容器中,最后呼叫一個擴展方法,看代碼:

 1     class MyRouteValueTransformer : DynamicRouteValueTransformer 2     { 3         public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values) 4         { 5             //通過values可以拿到原始路由資料 6             //可以替換或加入新的資料 7             values.Add("controller", "jj"); 8             values.Add("action", "kkk"); 9             return new ValueTask<RouteValueDictionary>(values);10         }11     }12 13 public void ConfigureServices(IServiceCollection services)14         {15             services.AddSingleton<MyRouteValueTransformer>();16             services.AddControllers();17         }18 19 endpoints.MapDynamicControllerRoute<MyRouteValueTransformer>("aaa/bbb/{id}");

這樣將來請求抵達時,決議得到終結點時會呼叫我們的MyRouteValueTransformer,我們可以獲取已決議得到的路有資料,然后選擇替換/增加某些路由資料,從而達到定制化

 

回退路由

默認情況下請求抵達時,若沒有找到匹配的終結點,就直接404了,我們希望當沒有匹配到任何終結點時直接執行某個默認的終結點,可以用如下方式:

endpoints.MapFallbackToController("{controller}/{action}/{id?}", "kkk", "jj");

當請求抵達時,如果沒有匹配到任何終結點,則默認執行jjController.kkk方法,可以想象得到此功能可能是通過動態路由實作的

還有幾個相關的擴展方法,有了上面的講解,估計你也能猜出是干嘛用的了,關于路由注冊就暫時說這么多

 

自定義中間件提前拿到終結點資料

app.UseRouting();對應概述中的步驟3,此擴展方法內部會注冊一個中間件,將來請求抵達時它會幫我們找到與當前請求匹配的終結點并存盤在HttpContext中,且匹配程序中決議得到的路由資料在Request.RouteValues中,我們可以在它后面加入自己的中間件

1 app.UseRouting();2 app.Use((conttext,next)=> {3       var endpoint = conttext.GetEndpoint();//拿到終結點4       var routeData = https://www.cnblogs.com/jionsoft/p/conttext.Request.RouteValues;//拿到路由資料
     //做些牛B的事
5 return next();6 });

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/79171.html

標籤:.NET Core

上一篇:使用 HttpClient 進行表單提交時,遇到的問題

下一篇:c#在另一個表單中的tabpage1中顯示一個表單方法?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more