精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解讀ASP.NET 5 & MVC6系列(10):Controller與Action

移動開發 Android
我們知道在MVC5和之前的版本,兩個框架的生命周期是不一樣的,在新版MVC6中,MVC Controller/Web API Controller已經合二為一了,本章我們主要講解Controller和Action的定義與使用,以及在MVC框架中,如何根據路由查詢相應的Controller和Action。

我們知道在MVC5和之前的版本,兩個框架的生命周期是不一樣的,在新版MVC6中,MVC Controller/Web API Controller已經合二為一了,本章我們主要講解Controller和Action的定義與使用,以及在MVC框架中,如何根據路由查詢相應的Controller和Action。

Controller&Action的定義和使用

在新版MVC6框架中,依然提供了一個Controller基類,在這里除了依然提供了Url、RouteData、HttpContext、Request、Response以外,還提供了一個IServiceProvider類型的Resovler屬性,該屬于是依賴注入的容器,用于獲取當前請求作用域內指定類型的實例對象。

其遵守如下規則:

繼承于Microsoft.AspNet.Mvc.Controller的類肯定都是控制器,不管有沒有Controller后綴。

不繼承Microsoft.AspNet.Mvc.Controller的自定義XXXController要作為MVC Controller的話,,則必須要引用Microsoft.AspNet.Mvc相關的程序集。

如果不想讓滿足上述條件的Controller類作為Controller,需要在該類上加上NonControllerAttribute特性。

同理,如果不想讓某個Controller中的方法作為Action,則需要在該方法上加上NonActionAttribute特性。

另外還有如下幾個特性需要注意:

解讀ASP.NET 5 & MVC6系列(10):Controller與Action

Controller的查找機制

由上述章節,我們知道MVC6不僅支持正常的Controller(繼承于Controller基類的子類),也支持POCO的Controller,本節我們就來研究一下Controller的查找原理機制。

首先,要判斷一個類是否是Controller必須先確定有多少個程序集里定義了這樣的類。Microsoft.AspNet.Mvc命名空間下的IAssemblyProvider接口就是覆蓋查找所有可能定義Controller的程序集,該接口的默認實現是DefaultAssemblyProvider類,在該類中,設置的必要條件是,定義了MVC的Controller必須要引用了如下程序集中的一個或多個程序集,列表如下:

  1. Microsoft.AspNet.Mvc 
  2. Microsoft.AspNet.Mvc.Core 
  3. Microsoft.AspNet.Mvc.ModelBinding 
  4. Microsoft.AspNet.Mvc.Razor 
  5. Microsoft.AspNet.Mvc.Razor.Host 
  6. Microsoft.AspNet.Mvc.TagHelpers 
  7. Microsoft.AspNet.Mvc.Xml 
  8. Microsoft.AspNet.PageExecutionInstrumentation.Interfaces

也就是說,如果你定義了一個引用了Microsoft.AspNet.Mvc的DLL類庫的話,其里面的POCO Controller都會被認為是MVC的Controller。換句話說,如果你定義的POCO Controller類沒有引用上述程序集中的任意一個程序集,那這些Controller類不會被認為是MVC的Controller。

程序集的查找

目前有兩種方式可以自定義Controller的查找機制,***種是繼承IAssemblyProvider實現CandidateAssemblies方法(或重載DefaultAssemblyProvider),來定義自己的邏輯。接口定義如下:

  1. public interface IAssemblyProvider 
  2.     IEnumerable CandidateAssemblies { get; } } 

另外一種方式,可能相對來說更簡單一些,那就是使用IServicesCollection上定義的擴展方法來定義要查找的程序集:

  1. services.AddMvc().WithControllersAsServices(new[] 
  2.     typeof(MyController).Assembly, 
  3.     typeof(ExternalPocoController).Assembly 
  4. }); 

使用上述代碼后,系統將會把DefaultAssemblyProvider切換成FixedSetAssemblyProvider來實現上述判斷機制,即:在固定范圍內的程序集里進行查找。

程序集的篩選

確定了程序集以后,另外一個問題就來了,如何判斷一個程序集是否引用了上述MVC必要條件中所列的程序集呢?答案是,Microsoft.Framework.Runtime中的ILibraryManager接口實例的GetReferencingLibraries方法,可以查找有多少個程序集引用了上述列表中的其中一個程序集。例如,可以根據Microsoft.AspNet.Mvc程序集,來查找有多少個程序集引用了該程序集,示例如下:

  1. var col = this.Resolver.GetRequiredService(); var data = col.GetReferencingLibraries("Microsoft.AspNet.Mvc"); 

 

該功能在DefaultAssemblyProvider默認實現類中的使用代碼如下:

protected virtual IEnumerable GetCandidateLibraries() {     if (ReferenceAssemblies == null)     {         return Enumerable.Empty();     }      // GetReferencingLibraries returns the transitive closure of referencing assemblies     // for a given assembly.     return ReferenceAssemblies.SelectMany(_libraryManager.GetReferencingLibraries)                                 .Distinct()                                 .Where(IsCandidateLibrary); }

 

Controller的判斷

確定了符合必要條件的程序集之后,就可以遍歷該程序集內所有的類型,并接著判斷該類型是否是Controller了。在新版的Controller判斷上,實現該功能的是一個IControllerTypeProvider接口,該接口提供了一個ControllerTypes只讀屬性用于獲取所有定義的Controller,接口定義如下:

  1. public interface IControllerTypeProvider 
  2.     IEnumerable ControllerTypes { get; } } 

DefaultControllerTypeProvider是該接口的默認實現,在查詢符合條件的Controller的時候,該默認實現類定義了一個IsController方法,用于判斷一個類型是否是Controller,具體邏輯如下:

protected internal virtual bool IsController([NotNull] TypeInfo typeInfo,
                                             [NotNull] ISet candidateAssemblies) {     if (!typeInfo.IsClass)  // 該類型必須是一個類     {         return false;     }     if (typeInfo.IsAbstract) // 該類必須不是抽象類     {         return false;     }     // We only consider public top-level classes as controllers. IsPublic returns false for nested     // classes, regardless of visibility modifiers     if (!typeInfo.IsPublic) // 該類必須是一個Public類(并且不嵌套),嵌套類不能作為Controller     {         return false;     }     if (typeInfo.ContainsGenericParameters) // 該類不能是泛型類     {         return false;     }     if (!typeInfo.Name.EndsWith(ControllerTypeName, StringComparison.OrdinalIgnoreCase) &&         !DerivesFromController(typeInfo, candidateAssemblies)) // 該類以Controller結尾,或繼承于Controller基類,或其父類也是Controller。     {         return false;     }     if (typeInfo.IsDefined(typeof(NonControllerAttribute))) // 該類不能設置NonControllerAttribute特性     {         return false;     }      return true; }

 

你也可以自己實現IControllerTypeProvider接口來定義自己的Controller判斷邏輯,不過和固定某些程序集類型,MVC在IServicesCollection上也提供了一個擴展方法,用于限制一些Controller特定類型,示例如下:


  1. services.AddMvc().WithControllersAsServices(new[] 
  2.     { 
  3.         typeof(MyController), 
  4.         typeof(ExternalPocoController) 
  5.     }); 

 

使用上述代碼后,系統將會把DefaultControllerTypeProvider切換成FixedSetControllerTypeProvider來實現上述判斷機制,即:限制某些特定的類作為Controller,其它類型都不能作為Controller。

Action的查找機制

Action的選擇則是通過IActionSelector接口的默認實現類DefaultActionSelector來實現的,在實現的SelectAsync方法中,通過上下文和路由數據選擇最匹配的Action,示意代碼如下:

  1. public Task SelectAsync([NotNull] RouteContext context) {    // ... }

還有一個地方會判斷一個方法是否是Action,那就是IActionModelBuilder接口,該接口的默認實現為DefaultActionModelBuilder類,實現方法如下:

public IEnumerable BuildActionModels([NotNull] TypeInfo typeInfo,                                                   [NotNull] MethodInfo methodInfo) {     if (!IsAction(typeInfo, methodInfo))     {         return Enumerable.Empty();     }     // ....省略其它代碼 }

 

該實現方法,通過一個內部的IsAction方法來判斷該方法是否是一個真正的Action方法,具體代碼如下:

  1. protected virtual bool IsAction([NotNull] TypeInfo typeInfo, [NotNull] MethodInfo methodInfo) 
  2.     // The SpecialName bit is set to flag members that are treated in a special way by some compilers 
  3.     // (such as property accessors and operator overloading methods). 
  4.     if (methodInfo.IsSpecialName)  // 不能是特殊名稱(如重載的操作符或屬性訪問器) 
  5.     { 
  6.         return false
  7.     } 
  8.  
  9.     if (methodInfo.IsDefined(typeof(NonActionAttribute)))  // 不能聲明NonActionAttribute特性 
  10.     { 
  11.         return false
  12.     } 
  13.  
  14.     // Overriden methods from Object class, e.g. Equals(Object), GetHashCode(), etc., are not valid. 
  15.     if (methodInfo.GetBaseDefinition().DeclaringType == typeof(object)) //不能是重載的方法,比如Equals和GetHashCode 
  16.     { 
  17.         return false
  18.     } 
  19.  
  20.     // Dispose method implemented from IDisposable is not valid 
  21.     if (IsIDisposableMethod(methodInfo, typeInfo))  // 不能是Dispose方法 
  22.     { 
  23.         return false
  24.     } 
  25.  
  26.     if (methodInfo.IsStatic) // 不能是靜態方法 
  27.     { 
  28.         return false
  29.     } 
  30.  
  31.     if (methodInfo.IsAbstract) // 不能是抽象方法 
  32.     { 
  33.         return false
  34.     } 
  35.  
  36.     if (methodInfo.IsConstructor)  // 不能是構造函數 
  37.     { 
  38.         return false
  39.     } 
  40.  
  41.     if (methodInfo.IsGenericMethod)  // 不能是泛型方法 
  42.     { 
  43.         return false
  44.     } 
  45.  
  46.     return 
  47.         methodInfo.IsPublic;   // 必須是Public方法 

以上內容就是關于Controller和Action查找相關的重要代碼,詳細原理步驟,請參考Microsoft.AspNet.Mvc.Core程序集下的所有源碼。

 

責任編輯:chenqingxiang 來源: 湯姆大叔的博客
相關推薦

2015-06-18 16:29:14

ASP.NET

2015-06-17 14:42:04

ASP.NET

2015-06-29 10:00:02

ASP.NETMVC6

2015-06-17 16:04:36

ASP.NET

2015-06-18 16:39:17

ASP.NET

2015-06-18 14:13:36

ASP.NET

2015-06-18 17:04:22

ASP.NET

2015-06-17 16:01:30

ASP.NET

2015-06-16 15:01:59

ASP.NET 5

2015-06-17 16:45:28

ASP.NET

2015-06-17 10:16:30

ASP.NET

2015-06-17 14:09:36

ASP.NET

2015-06-18 17:37:19

ASP.NET

2015-06-17 14:16:50

ASP.NET

2015-06-17 14:18:50

ASP.NET

2015-06-18 17:34:25

ASP.NET

2015-06-18 14:25:56

ASP.NET

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2014-08-26 09:22:40

ASP.NET MVCRouting
點贊
收藏

51CTO技術棧公眾號

特大黑人巨人吊xxxx| 国产精品久久成人免费观看| 国产高清中文字幕| 欧美色图激情小说| 欧美一区日韩一区| 欧美日韩亚洲一| 日本免费中文字幕在线| 国产v日产∨综合v精品视频| 国产成人97精品免费看片| 国产suv精品一区二区68| 欧美日韩一本| 欧美一区二区三区色| 黑人糟蹋人妻hd中文字幕| 日本三级在线播放完整版| av一区二区三区| 国产在线98福利播放视频| 国产精品自拍视频一区| 日韩国产在线| 日韩电影第一页| 午夜激情视频网| 伊人久久高清| 午夜久久久久久电影| 五月天男人天堂| 黄色视屏网站在线免费观看| 国产91丝袜在线播放0| 国产精品亚发布| 黄色片中文字幕| 国内精品久久久久久久影视蜜臀| 国产一区二区三区视频免费| 中文字幕在线播放视频| 天堂精品久久久久| 51久久夜色精品国产麻豆| 日日碰狠狠丁香久燥| 9999在线视频| 一区二区三区中文在线观看| 神马影院午夜我不卡影院| 日韩国产福利| 91麻豆免费看片| 国产精品免费一区二区| www.日韩高清| 国内久久精品视频| 成人av在线天堂| 中文字幕av久久爽| 日韩av一级片| 国产精品免费视频xxxx| 不卡av电影在线| 免费一区视频| 日本午夜精品理论片a级appf发布| 国产无遮无挡120秒| 综合久久婷婷| 欧美大奶子在线| 欧美黄色aaa| 欧美激情成人在线| 久久91亚洲精品中文字幕| 欧美做爰爽爽爽爽爽爽| 先锋资源久久| 操人视频在线观看欧美| 希岛爱理中文字幕| 欧美日韩综合| 欧美精品18videos性欧| 国产无码精品视频| 夜夜嗨网站十八久久| 久久免费成人精品视频| 日韩美女一级片| 国产日韩欧美一区| 日韩av电影手机在线| 波多野结衣视频网址| 欧美a级理论片| 91精品视频在线播放| 精品国产无码一区二区| 成人午夜在线视频| 久久久久欧美| av在线1区2区| 亚洲伦在线观看| 美女黄色免费看| 涩涩av在线| 欧美日韩你懂的| 毛片毛片毛片毛片毛| а√中文在线天堂精品| 亚洲精品美女在线观看播放| 久久精品国产亚洲av麻豆| 国产伦精品一区二区三区视频| 一本一道久久a久久精品逆3p| 美女av免费看| 黄色免费成人| 国产精品99蜜臀久久不卡二区 | 欧美日韩国产精品一区二区亚洲| 久久男人资源视频| 国产日韩在线免费观看| 国产精一区二区三区| 国产一区二区久久久| 高清中文字幕一区二区三区| 亚洲欧洲99久久| 欧美黑人在线观看| 91综合国产| 欧美精品一区二区不卡| 五月天综合视频| 欧美精品二区| 国产91色在线播放| 亚洲精品久久久久久久久久久久久久 | 一区二区三区蜜桃网| 欧洲黄色一级视频| 国产精品99久久免费| 精品一区电影国产| 欧美三根一起进三p| 久久精品一区二区国产| 91亚洲va在线va天堂va国| 清纯唯美亚洲色图| 亚洲精品免费视频| 国产免费又粗又猛又爽| 国产伦乱精品| 久久中文久久字幕| www.五月婷婷.com| 成人av动漫在线| 香蕉视频在线网址| 色8久久影院午夜场| 日韩精品专区在线影院观看 | 成人激情在线| 国内成人精品一区| 国产jzjzjz丝袜老师水多| 国产日本欧洲亚洲| 国产黄视频在线| 伊人精品久久| 久久五月天综合| 成人毛片一区二区三区| 99精品国产91久久久久久| 天堂av在线中文| 台湾天天综合人成在线| 亚洲欧美日韩综合| 日本va欧美va国产激情| 国产成人在线免费观看| 在线亚洲美日韩| av在线一区不卡| 亚洲精品丝袜日韩| 国产成人无码精品久久久久| 国产福利一区二区三区视频在线 | 欧美日韩精品欧美日韩精品| mm131美女视频| 国内自拍视频一区二区三区| 91亚洲精品视频| 日本免费视频在线观看| 欧美日韩精品高清| 网站永久看片免费| 免费精品视频在线| 亚洲国产精品视频一区| 成人啊v在线| 一区二区三区 在线观看视| 亚洲影院在线播放| 久久久精品国产免大香伊| 日本www在线视频| 麻豆国产欧美一区二区三区r| 欧美国产日韩一区| 亚洲第一视频在线| 一区二区三区国产精品| 美女扒开腿免费视频| 国产综合自拍| 国产欧美亚洲日本| 在线观看v片| 亚洲日韩中文字幕在线播放| 无码人妻久久一区二区三区 | 成人va在线观看| 蜜臀av无码一区二区三区| 美女av一区| 欧美主播福利视频| 国产女人在线视频| 欧美精品精品一区| 丰满少妇高潮久久三区| 99免费精品视频| 国产偷人视频免费| 欧美a级片视频| 成人在线视频网址| 丁香高清在线观看完整电影视频| 亚洲精品久久久久久久久| 亚洲欧美偷拍视频| 国产精品久久久久久久久久免费看| 国产乱叫456| 亚洲黄色大片| 日韩视频在线观看国产| 欧美黄页在线免费观看| 欧美日产国产成人免费图片| 涩涩视频在线观看免费| 欧美艳星brazzers| 黄色一级视频免费观看| 91亚洲大成网污www| 亚洲一级免费在线观看| 黑丝一区二区| 日本日本精品二区免费| 国产精品久久久久久久久久久久久久久| 精品中文字幕乱| 加勒比一区二区三区在线| 5858s免费视频成人| 综合激情网五月| 亚洲男人天堂av| 国产三级国产精品| 国产综合色精品一区二区三区| 无码粉嫩虎白一线天在线观看| 精品一区三区| 99久久精品免费看国产一区二区三区 | 国产福利在线视频| 日韩精品一区二区三区在线观看 | 91精品久久久久久蜜臀| 四虎成人永久免费视频| 亚洲欧美视频在线观看视频| 成年人免费观看视频网站| 国产成人福利片| 午夜国产一区二区三区| 日韩视频在线一区二区三区| 婷婷视频在线播放| 免费观看久久av| 国产精品久久精品国产| 自拍偷拍欧美日韩| 国产精品久久久久久久久影视| av福利导福航大全在线| 久久久av网站| 国产特黄在线| 亚洲国产精品高清久久久| 日韩在线观看视频一区二区| 久久久久久免费| 中文字幕一二三区| 久久机这里只有精品| 免费一级特黄特色毛片久久看| 欧美aaaa视频| 免费在线一区二区| 精品综合久久88少妇激情| 国产精品吴梦梦| rebdb初裸写真在线观看| 尤物九九久久国产精品的特点| 精品国产一级片| 欧美日韩综合色| 天堂网av手机版| 亚洲成人精品一区| 极品久久久久久| 中文字幕一区二区三区在线不卡 | 蜜桃久久久久久久| 午夜肉伦伦影院| 亚洲网址在线| 日本在线观看一区二区| 福利电影一区| 亚洲最大激情中文字幕| 日韩久久99| 国产精品视频在线观看| 成人美女视频| 午夜精品久久久久久久久久久久久| 国产小视频在线观看| 亚洲电影成人av99爱色| 亚洲第一大网站| 日韩精品一区二区三区四区| 91超薄丝袜肉丝一区二区| 欧美午夜美女看片| 国产成人在线免费观看视频| 一区2区3区在线看| 青娱乐国产在线视频| 综合自拍亚洲综合图不卡区| 日韩一区二区a片免费观看| 久久综合九色综合97婷婷女人| 香蕉视频免费网站| 国产suv精品一区二区三区| 97人人爽人人| 国产一区二区三区在线观看免费 | 福利一区福利二区微拍刺激| 九九在线观看视频| 亚洲六月丁香色婷婷综合久久 | 国产精品夜夜夜爽张柏芝| 色男人天堂综合再现| 亚洲精品美女久久7777777| 九色精品国产蝌蚪| 久久99欧美| 亚洲美女久久| 欧美激情第一页在线观看| 亚洲老女人视频免费| 茄子视频成人在线观看| 国产欧美一区| 亚洲国产精品毛片| 国产高清一区二区| www.欧美黄色| 国产日韩欧美在线播放不卡| 欧美视频第一区| 日本午夜一本久久久综合| 久久国产成人精品国产成人亚洲 | 精品调教chinesegay| 巨骚激情综合| 中文字幕视频一区二区在线有码| 91官网在线| 久久天天躁狠狠躁夜夜av| 黄色网页在线播放| 欧美激情国产精品| 中文在线最新版地址| 国产精品免费一区二区三区都可以| 午夜无码国产理论在线| 91网站免费观看| 无码国模国产在线观看| 好吊色欧美一区二区三区四区| 久久综合影院| 正在播放91九色| 亚洲三级免费| www午夜视频| 国产成人精品免费| 国精产品一区一区三区免费视频| 国产精品色在线| 久久免费小视频| 欧美日韩国产中文字幕 | 欧美精品成人在线| 欧美xxxxxx| 91精品国产综合久久久久久丝袜 | 视频一区在线视频| 亚洲理论中文字幕| 99久久精品免费看国产免费软件| 欧美性猛交xxxx乱| 一区二区在线免费观看| 免费av网站在线| 日韩欧美亚洲一区二区| 天堂中文网在线| 日韩在线资源网| 色噜噜狠狠狠综合欧洲色8| 日韩av黄色在线观看| 国产精品igao视频网网址不卡日韩| 91久久国产综合久久蜜月精品 | 久久福利影视| 国产成人av片| 国产精品久久免费看| 91精品国产乱码久久久张津瑜| 91精品国产综合久久福利| 九九热视频在线观看| 欧美黑人极品猛少妇色xxxxx| 亚洲伦乱视频| 黑人巨大精品欧美一区二区小视频 | 性欧美videos另类hd| 国产一区二区三区高清在线观看| 成人免费高清观看| 91免费福利视频| 激情五月色综合国产精品| 欧洲精品一区二区三区久久| 黄页网站大全一区二区| 五月开心播播网| 亚洲一区二区三区四区五区中文 | 日韩欧美国产综合| 菠萝菠萝蜜在线视频免费观看| 国产精品久久久久9999| 欧美激情极品| 一区二区传媒有限公司| 国产高清亚洲一区| 中文字幕在线有码| 日韩欧美国产三级| 黄色片免费在线观看| 国产精品精品一区二区三区午夜版 | 一区在线播放视频| 这里只有久久精品视频| 一本大道亚洲视频| 成人免费看视频网站| 国产精品一区二区在线观看| 五月婷婷六月综合| 三级a在线观看| 91在线精品一区二区三区| 日本一区二区网站| 精品88久久久久88久久久| 国产丝袜在线| 国产伊人精品在线| 欧美r级电影| 老司机午夜性大片| 亚洲国产高清不卡| 少妇无套内谢久久久久| 尤物九九久久国产精品的分类| 亚洲播播91| 色吧亚洲视频| 美腿丝袜亚洲三区| 一本在线免费视频| 欧美高清视频一二三区| 美女av在线播放| 亚洲japanese制服美女| 欧美激情 亚洲a∨综合| 中文字幕一区二区三区人妻在线视频| 一区二区在线免费| 日本高清视频网站| 欧美在线亚洲在线| 精品视频黄色| 亚洲精品20p| 悠悠色在线精品| 亚洲av综合色区无码一二三区| 久久久久久久久久久91| 欧美网色网址| 尤物国产在线观看| 一区二区免费看| 黑人乱码一区二区三区av| 97碰在线观看| 北条麻妃国产九九九精品小说| 日韩肉感妇bbwbbwbbw| 亚洲丝袜自拍清纯另类| 午夜精品久久久久久久99老熟妇| 欧美在线一区二区视频| 成人婷婷网色偷偷亚洲男人的天堂| 91蝌蚪视频在线观看| 一区二区高清视频在线观看| 深夜福利视频一区| 国产在线视频不卡| 亚洲精品日韩久久| 国产精品久久久视频| 亚洲大胆人体在线| 日本精品网站| 久久国产精品免费观看| 久久综合久久综合久久|