標籤: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中的控制器啟用與反射之間的聯絡(協助理解)