国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - ASP.NET Core MVC 配置全局路由前綴

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

2020-03-25 14:43Savorboard ASP.NET教程

這篇文章主要介紹了ASP.NET Core MVC 配置全局路由前綴的相關(guān)資料,需要的朋友可以參考下

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

前言

大家好,今天給大家介紹一個(gè) ASP.NET Core MVC 的一個(gè)新特性,給全局路由添加統(tǒng)一前綴。嚴(yán)格說(shuō)其實(shí)不算是新特性,不過(guò)是Core MVC特有的。

應(yīng)用背景

不知道大家在做 Web Api 應(yīng)用程序的時(shí)候,有沒(méi)有遇到過(guò)這種場(chǎng)景,就是所有的接口都是以 /api 開(kāi)頭的,也就是我們的api 接口請(qǐng)求地址是像這樣的:

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

或者是這樣的需求

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

在以前,我們?nèi)绻獙?shí)現(xiàn)這種需求,可以在 Controller 中添加一個(gè) [Route("/api/order")] 這樣的特性路由 Attribute,然后MVC 框架就會(huì)掃描你的路由表從而可以匹配到 /api/order 這樣的請(qǐng)求。

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

現(xiàn)在,有一種更加簡(jiǎn)便優(yōu)雅的方式來(lái)做這個(gè)事情了,你可以統(tǒng)一的來(lái)添加一個(gè)全局的前綴路由標(biāo)記,下面就一起來(lái)看看吧。

IApplicationModelConvention 接口

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

?
1
2
3
4
5
public interface IApplicationModelConvention
{
 void Apply(ApplicationModel application);
}

我們知道,MVC 框架有一些約定俗成的東西,那么這個(gè)接口就是主要是用來(lái)自定義一些 MVC 約定的一些東西的,我們可以通過(guò)指定 ApplicationModel 對(duì)象來(lái)添加或者修改一些約定。可以看到接口提供了一個(gè) Apply的方法,這個(gè)方法有一個(gè)ApplicationModel對(duì)象,我們可以利用這個(gè)對(duì)象來(lái)修改我們需要的東西,MVC 框架本身在啟動(dòng)的時(shí)候會(huì)注入這個(gè)接口到 Services 中,所以我們只需要實(shí)現(xiàn)這個(gè)接口,然后稍加配置即可。

那再讓我們看一下ApplicationModel 這個(gè)對(duì)象都有哪些東西:

?
1
2
3
4
5
6
7
8
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:主要是配置默認(rèn)MVC Api Explorer的一些東西,包括Api的描述信息,組信息,可見(jiàn)性等。
  2. ControllerModel:主要是 Comtroller 默認(rèn)約定相關(guān)的了,這個(gè)里面東西就比較多了,就不一一介紹了,我們等下就要配置里面的一個(gè)東西。
  3. IFilterMetadata :空接口,主要起到標(biāo)記的作用。

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

下面,我們就利用這個(gè)特性來(lái)實(shí)現(xiàn)我們今天的主題。謝謝你點(diǎn)的贊~ :)

添加全局路由統(tǒng)一前綴

沒(méi)有那么多廢話了,直接上代碼,要說(shuō)的話全在代碼里:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//定義個(gè)類RouteConvention,來(lái)實(shí)現(xiàn) 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)
  {
   // 已經(jīng)標(biāo)記了 RouteAttribute 的 Controller
   var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
   if (matchedSelectors.Any())
   {
    foreach (var selectorModel in matchedSelectors)
    {
     // 在 當(dāng)前路由上 再 添加一個(gè) 路由前綴
     selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,
      selectorModel.AttributeRouteModel);
    }
   }
 
   // 沒(méi)有標(biāo)記 RouteAttribute 的 Controller
   var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();
   if (unmatchedSelectors.Any())
   {
    foreach (var selectorModel in unmatchedSelectors)
    {
     // 添加一個(gè) 路由前綴
     selectorModel.AttributeRouteModel = _centralPrefix;
    }
   }
  }
 }
}

然后,我們就可以開(kāi)始使用我們自己定義的這個(gè)類了。

?
1
2
3
4
5
6
7
8
public static class MvcOptionsExtensions
{
 public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
 {
  // 添加我們自定義 實(shí)現(xiàn)IApplicationModelConvention的RouteConvention
  opts.Conventions.Insert(0, new RouteConvention(routeAttribute));
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Startup
{
 public Startup(IHostingEnvironment env)
 {
  //...
 }
 
 public void ConfigureServices(IServiceCollection services)
 {
  //...
  
  services.AddMvc(opt =>
  {
   // 路由參數(shù)在此處仍然是有效的,比如添加一個(gè)版本號(hào)
   opt.UseCentralRoutePrefix(new RouteAttribute("api/v{version}"));
  });
 }
 
 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
  //...
  
  app.UseMvc();
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Route("order")]
public class OrderController : Controller
{
 // 路由地址 : /api/v{version}/order/details/{id}
 [Route("details/{id}")]
 public string GetById(int id, int version)
 {
  //上面是可以接收到版本號(hào)的,返回 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)
 {
  //上面是可以接收到版本號(hào)的,返回 version 和 id
  return $"item: {id}, version: {version}";
 }
}

總結(jié)

上面的黑體字,希望大家能夠理解并運(yùn)用,這個(gè)例子只是實(shí)際需求中的很小的一個(gè)場(chǎng)景,在具體的項(xiàng)目中會(huì)有各種各樣正常或者非正常的需求,我們?cè)谧鲆粋€(gè)功能的時(shí)候要多多思考,其實(shí) MVC 框架還有很多東西可以去學(xué)習(xí),包括它的設(shè)計(jì)思想,擴(kuò)展性等東西,都是需要慢慢領(lǐng)悟的。如果大家對(duì) ASP.NET Core 感興趣,可以關(guān)注我一下,我會(huì)定期在博客中分享我的一些學(xué)習(xí)成果吧。

通過(guò)此文希望能幫助大家,謝謝大家對(duì)本站的支持!

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲精品在线视频 | 男女视频网站 | 在线观看特色大片免费网站 | 日本一区二区三区四区 | 精品成人免费一区二区在线播放 | 国产精品中文字幕在线 | 私人毛片免费高清视频 | 蜜桃香蕉视频 | 国产成人无遮挡在线视频 | 欧美日韩视频在线 | 国产精品美女久久久久高潮 | 日韩在线视频免费 | 国产精品久久电影观看 | 欧美综合激情 | 在线观看免费黄视频 | 免费啪啪网站 | aa一级视频| 五月婷婷香蕉 | 久久九九| 国产毛片视频 | 中文字幕久久精品 | 超碰成人在线免费 | www.久久.com | 亚洲视频成人 | 自拍亚洲| 国产一区二区三区在线观看视频 | 久久久国产视频 | 亚洲影视一区 | 高清在线一区 | 中文字幕一区二区在线观看 | 亚洲精品一区 | 久久国产精品久久久久久久久久 | 成年人免费小视频 | 激情欧美日韩一区二区 | 蜜桃视频网站在线观看 | 久久国产亚洲精品 | 一区二区三区四区精品 | 精品免费 | 精品在线一区二区 | 久久综合伊人 | 国产一区二区影院 |