ASP.NET MVC中的控制器啟用與反射之間的聯絡(協助理解)

來源:互聯網
上載者:User

標籤:module   csharp   sse   handle   作用   handler   das   應用程式   extension   

  ASP.NET Mvc是ASP.NET的一個架構,同樣也是基於管道的設計結構。HttpModule和HttpHandler是ASP.NET的兩個重要組件,同樣的在Mvc中也是非常重要的組件。在應用程式中的管道設計結構下實際上是由一系列的事件組合在一起的。這些事件可以有HttpModule來訂閱,訂閱的時機是在應用程式載入設定檔的時候,訂閱web.config中httomodules配置的相關事件。而HttpHandler的作用就是最終的真正執行。

  啟用前準備首先要說的是路由系統一個Web應用程式全域維護這一個RouteTable類型的路由表,可以在Application_Start()中配置相關的路由模板,在Mvc的路由配置是在該命名空間下System.Web.Mvc.RouteCollectionExtensions。路由模板就儲存在RouteTable下的靜態唯讀類型Routes。它是一個RouteCollection的類型。擷取相應的路由資料RouteData,該類型下有幾個唯讀屬性Values是控制器和action的名稱,DataTokens是設定的自訂資料,RouteBase 類型的Route變數,在這個基類中有兩個方法是GetRouteData()return RouteData和GetVirtualPath()return VirtualPathData

  UrlRoutingModule是ASP.NET 的路由系統實現了IRouteModule介面。它的作用是攔截請求並分析出以Controller和Action為核心的RouteData對象。RouteData

然後將相應的處理交給實現了IHTTPHandler的執行類。下面是自訂的事件對請求進行攔截,然後發送給相應的處理常式進行執行。

  public class CustomModule : IHttpModule    {        public event EventHandler ExposedEvent;//HttpModule事件,供Global.asax來訂閱        public void Init(HttpApplication context)        {            context.PostResolveRequestCache += new EventHandler(this.PostResolveRequestCache);        }        void PostResolveRequestCache(object sender, EventArgs e)        {            HttpContextBase context = new HttpContextWrapper(((HttpApplication)sender).Context);            RouteData routeData = RouteTable.Routes.GetRouteData(context);            RequestContext requestContext = new RequestContext(context, routeData);            if (routeData == null)            {                return;            }            context.Request.RequestContext = requestContext;            context.RemapHandler(new CustomHandler(routeData));        }        public void Dispose()        {        }    }

  擷取到路由資料之後一起發送給自訂的IhttpHandler類中,在這裡將進行controller的解析和啟用,控制器的解析實際上是通過BuildManager的GerReferancedAssmeblies反射擷取應用程式中的所有可以的程式集,之後再進步一尋找哪些繼承IController介面的類型,最後與提供的控制器名稱+“Controller”匹配是否存在唯一的一個Controller類型,如果是那麼進一步進行反射出控制器中的Action來執行。一下代碼列出了對Controller的尋找,

 public class CustomHandler : IHttpHandler    {        readonly RouteData routeData;        public bool IsReusable        {            get { return false; }        }        public RequestContext RequestContext { get; private set; }        public CustomHandler(RouteData routeData)        {            this.routeData = routeData;        }        public CustomHandler(RequestContext requestContext)        {            this.RequestContext = requestContext;        }        public void ProcessRequest(HttpContext context)        {            var controllerTypes = new List<Type>();            foreach (Assembly assembly in BuildManager.GetReferencedAssemblies())            {                controllerTypes.AddRange(assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type)));            }            var array = controllerTypes.Where(type => string.Compare("visaController", type.Name, true) == 0).FirstOrDefault();            var methodInfo = array.GetMethods();        }    }

  

ASP.NET MVC中的控制器啟用與反射之間的聯絡(協助理解)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.