亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

ASP.NET Core MVC 配置全局路由前綴

2024-07-10 13:31:25
字體:
來源:轉載
供稿:網友

ASP.NET Core MVC 配置全局路由前綴

前言

大家好,今天給大家介紹一個 ASP.NET Core MVC 的一個新特性,給全局路由添加統一前綴。嚴格說其實不算是新特性,不過是Core MVC特有的。

應用背景

不知道大家在做 Web Api 應用程序的時候,有沒有遇到過這種場景,就是所有的接口都是以 /api 開頭的,也就是我們的api 接口請求地址是像這樣的:

http://www.example.com/api/order/333

或者是這樣的需求

http://www.example.com/api/v2/order/333

在以前,我們如果要實現這種需求,可以在 Controller 中添加一個 [Route("/api/order")] 這樣的特性路由 Attribute,然后MVC 框架就會掃描你的路由表從而可以匹配到 /api/order 這樣的請求。

但是第二個帶版本號的需求,原本 Controller 的 Route 定義是 [Route("/api/v1/order")],現在要升級到v2,又有上百個接口,這就需要一個一個修改,可能就會懵逼了。

現在,有一種更加簡便優雅的方式來做這個事情了,你可以統一的來添加一個全局的前綴路由標記,下面就一起來看看吧。

IApplicationModelConvention 接口

首先,我們需要使用到 IApplicationModelConvention這個接口,位于 Microsoft.AspNetCore.Mvc.ApplicationModels 命名空間下,我們來看一下接口的定義。

public interface IApplicationModelConvention{ void Apply(ApplicationModel application);} 

我們知道,MVC 框架有一些約定俗成的東西,那么這個接口就是主要是用來自定義一些 MVC 約定的一些東西的,我們可以通過指定 ApplicationModel 對象來添加或者修改一些約定??梢钥吹浇涌谔峁┝艘粋€ Apply的方法,這個方法有一個ApplicationModel對象,我們可以利用這個對象來修改我們需要的東西,MVC 框架本身在啟動的時候會注入這個接口到 Services 中,所以我們只需要實現這個接口,然后稍加配置即可。

那再讓我們看一下ApplicationModel 這個對象都有哪些東西:

public class ApplicationModel : IPropertyModel, IFilterModel, IApiExplorerModel{ public ApiExplorerModel ApiExplorer { get; set; } public IList<ControllerModel> Controllers { get; } public IList<IFilterMetadata> Filters { get; } public IDictionary<object, object> Properties { get; }}

可以看到有 ApiExplorer,Controllers,Filters,Properties 等屬性。

  1. ApiExplorerModel:主要是配置默認MVC Api Explorer的一些東西,包括Api的描述信息,組信息,可見性等。
  2. ControllerModel:主要是 Comtroller 默認約定相關的了,這個里面東西就比較多了,就不一一介紹了,我們等下就要配置里面的一個東西。
  3. IFilterMetadata :空接口,主要起到標記的作用。

還有一個地方需要告訴大家的是,可以看到上面的 Controllers 屬性它是一個IList<ControllerModel>,也就是說這個列表中記錄了你程序中的所有 Controller 的信息,你可以通過遍歷的方式針對某一部分或某個 Controller 進行設置,包括Controller中的Actions的信息都可以通過此種方式來設置,我們可以利用這個特性來非常靈活的對 MVC 框架進行改造,是不是很炫酷。

下面,我們就利用這個特性來實現我們今天的主題。謝謝你點的贊~ :)

添加全局路由統一前綴

沒有那么多廢話了,直接上代碼,要說的話全在代碼里:

//定義個類RouteConvention,來實現 IApplicationModelConvention 接口public class RouteConvention : IApplicationModelConvention{ private readonly AttributeRouteModel _centralPrefix; public RouteConvention(IRouteTemplateProvider routeTemplateProvider) {  _centralPrefix = new AttributeRouteModel(routeTemplateProvider); } //接口的Apply方法 public void Apply(ApplicationModel application) {  //遍歷所有的 Controller  foreach (var controller in application.Controllers)  {   // 已經標記了 RouteAttribute 的 Controller   var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();   if (matchedSelectors.Any())   {    foreach (var selectorModel in matchedSelectors)    {     // 在 當前路由上 再 添加一個 路由前綴     selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,      selectorModel.AttributeRouteModel);    }   }   // 沒有標記 RouteAttribute 的 Controller   var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();   if (unmatchedSelectors.Any())   {    foreach (var selectorModel in unmatchedSelectors)    {     // 添加一個 路由前綴     selectorModel.AttributeRouteModel = _centralPrefix;    }   }  } }}

然后,我們就可以開始使用我們自己定義的這個類了。

public static class MvcOptionsExtensions{ public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute) {  // 添加我們自定義 實現IApplicationModelConvention的RouteConvention  opts.Conventions.Insert(0, new RouteConvention(routeAttribute)); }}

最后,在 Startup.cs 文件中,添加上面的擴展方法就可以了。

public class Startup{ public Startup(IHostingEnvironment env) {  //... } public void ConfigureServices(IServiceCollection services) {  //...    services.AddMvc(opt =>  {   // 路由參數在此處仍然是有效的,比如添加一個版本號   opt.UseCentralRoutePrefix(new RouteAttribute("api/v{version}"));  }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {  //...    app.UseMvc(); }}

其中,opt.UseCentralRoutePrefix 就是上面定義的那個擴展方法,此處路由參數仍然是可以使用的,所以比如你可以給你的接口指定一個版本號之類的東西。這樣之后,你的所有 Controller 的 RoteAttribute 都會添加上了這個前綴,這樣就完美解決了最開始的那個版本號的需求。他們看起來大概是這樣的:

[Route("order")]public class OrderController : Controller{ // 路由地址 : /api/v{version}/order/details/{id} [Route("details/{id}")] public string GetById(int id, int version) {  //上面是可以接收到版本號的,返回 version 和 id  return $"other resource: {id}, version: {version}"; }}public class ItemController : Controller{ // 路由地址: /api/v{version}/item/{id} [Route("item/{id}")] public string GetById(int id, int version) {  //上面是可以接收到版本號的,返回 version 和 id  return $"item: {id}, version: {version}"; }}

總結

上面的黑體字,希望大家能夠理解并運用,這個例子只是實際需求中的很小的一個場景,在具體的項目中會有各種各樣正常或者非正常的需求,我們在做一個功能的時候要多多思考,其實 MVC 框架還有很多東西可以去學習,包括它的設計思想,擴展性等東西,都是需要慢慢領悟的。如果大家對 ASP.NET Core 感興趣,可以關注我一下,我會定期在博客中分享我的一些學習成果吧。

通過此文希望能幫助大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕在线视频| 欧美日韩视频在线| 秋霞成人午夜鲁丝一区二区三区| 日韩美女毛茸茸| 91av视频在线免费观看| 日韩的一区二区| 国产精品影院在线观看| 米奇精品一区二区三区在线观看| 黑人巨大精品欧美一区二区三区| 国产日韩中文在线| 69av成年福利视频| 欧美亚洲另类视频| 国产成人免费91av在线| 国产精品成久久久久三级| 国产成人精品久久亚洲高清不卡| 国a精品视频大全| 日韩欧美在线网址| 久久影院中文字幕| 亚洲的天堂在线中文字幕| 国产精品丝袜久久久久久高清| 亚洲一级一级97网| 最新国产精品拍自在线播放| 韩国国内大量揄拍精品视频| 日韩成人中文字幕| 欧美人成在线视频| 久久久久久中文| 精品无人国产偷自产在线| 久久久91精品| 精品福利一区二区| 亚洲图片在区色| 5566日本婷婷色中文字幕97| 国产精品影院在线观看| 国产精品麻豆va在线播放| 成人免费淫片视频软件| 国产精品高清网站| 91免费看国产| 国产成人精品免费久久久久| 欧美亚洲日本黄色| 91久久精品一区| 国产视频精品va久久久久久| 久久九九热免费视频| 欧美一级片免费在线| 日韩av网站大全| …久久精品99久久香蕉国产| 国产91精品久久久久| 97国产精品免费视频| 亚洲自拍偷拍福利| 国产精品吴梦梦| 亚洲欧美国产精品| 91亚洲国产精品| 亚洲第一视频在线观看| 亚洲精品影视在线观看| 亚洲精品久久久久久下一站| 欧美寡妇偷汉性猛交| 国产精品福利久久久| 欧美午夜电影在线| 欧美日在线观看| 91精品视频免费看| 国产精品一区二区性色av| 亚洲qvod图片区电影| 国产美女91呻吟求| 一区二区三区四区在线观看视频| 日本中文字幕不卡免费| 亚洲成人精品久久| 欧美国产乱视频| 日韩免费不卡av| 91亚洲精品久久久| 日韩久久免费视频| 国产精品∨欧美精品v日韩精品| 蜜臀久久99精品久久久久久宅男| 亚洲男人天堂2023| 久久在精品线影院精品国产| 亚洲国产精品福利| 国产一区二区在线免费| 原创国产精品91| 成人欧美一区二区三区黑人孕妇| www.欧美精品一二三区| 精品国产成人在线| 大胆人体色综合| 国产精品欧美日韩久久| 亚洲第一免费网站| 色婷婷综合久久久久中文字幕1| 久久精品亚洲一区| 国产精品电影久久久久电影网| 亚洲天堂2020| 91免费综合在线| 精品国产一区二区三区四区在线观看| 91精品视频播放| 久久视频免费观看| 成人h视频在线| 91亚洲人电影| 国产三级精品网站| 国产精品久久99久久| 97久久久久久| 大荫蒂欧美视频另类xxxx| 久久中国妇女中文字幕| 国产精品入口尤物| 国产成人久久久精品一区| 91在线免费看网站| 一区二区福利视频| 午夜精品福利电影| 亚洲国产精品电影在线观看| 日韩在线欧美在线| 亚洲最大的av网站| 国产日韩av在线播放| 国模私拍一区二区三区| 日本一区二三区好的精华液| 日韩专区中文字幕| 欧美日韩国内自拍| 欧美大尺度激情区在线播放| 韩国三级日本三级少妇99| 精品免费在线观看| 欧美成人激情视频免费观看| 色偷偷av亚洲男人的天堂| 色综合天天狠天天透天天伊人| 91九色国产在线| 大伊人狠狠躁夜夜躁av一区| 91色视频在线导航| 中文字幕国内精品| 久热国产精品视频| 日韩在线一区二区三区免费视频| 91精品久久久久久久久中文字幕| 另类少妇人与禽zozz0性伦| 奇门遁甲1982国语版免费观看高清| 日韩高清电影免费观看完整版| 亚洲影院色在线观看免费| 亚洲国产精品网站| 国产亚洲aⅴaaaaaa毛片| 91在线中文字幕| 亚洲欧美日韩精品久久奇米色影视| 日韩成人中文电影| 欧美性视频网站| 日韩最新免费不卡| 成人一区二区电影| 97精品国产97久久久久久免费| 亚洲国产欧美久久| 国产亚洲成精品久久| 中文字幕亚洲欧美在线| 欧美激情欧美激情在线五月| 国产精品一区二区三区在线播放| 亚洲女同精品视频| 一本大道香蕉久在线播放29| 国产在线视频欧美| 国产精品91在线观看| 欧美老女人xx| 91精品国产乱码久久久久久蜜臀| 成人黄色av免费在线观看| 日韩一区二区三区在线播放| 最近2019中文字幕在线高清| 性色av一区二区三区免费| 久久精品在线视频| 国产精品国产三级国产aⅴ浪潮| 精品久久久av| 精品日本美女福利在线观看| 日韩成人网免费视频| 成人黄色免费在线观看| 欧美大成色www永久网站婷| 成人久久久久爱| 麻豆乱码国产一区二区三区| 国产精品www网站| 亚洲欧美日韩成人| 欧美老少做受xxxx高潮| 国产精品免费视频久久久| 国产一区二区美女视频|