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();
}
}

  

最新文章

  1. C++输入cout与输出cin
  2. AC日记——字符环 openjudge 1.7 30
  3. css中的zoom的使用
  4. android layout_weight 使用总结
  5. java 接口(基础思想一)
  6. (转)一个form表单实现提交多个action
  7. windows下netstat -aon命令
  8. 关于String s = new String(&quot;xyz&quot;); 创建几个对象的问题
  9. 原生应用native、Web应用、混合应用hybrid:3者的优缺点解析
  10. Canvas translate- 平移
  11. 自己动手写Redis客户端(C#实现)4 - 整数回复
  12. Docker与容器
  13. Java_设计模式之享元模式
  14. 通过TABULATE过程制作汇总报表
  15. 基于jquery二维码生成插件qrcode
  16. js工具库
  17. 2019-04-17-day034-线程与数据共享
  18. es中对mapping的理解
  19. JavaScript中直接量和变量
  20. java 字符串String

热门文章

  1. halcon 如何把一个region截取出来保存为图像
  2. C#利用QrCode.Net生成二维码(Qr码
  3. leetcode451
  4. Volatile关键字以及线程的内存可见性问题
  5. 【309】◀▶ Windows 相关功能实现
  6. jquery UI 的 datapicker 中文汉化问题
  7. 验证码及密码加密在java中使用
  8. css常用属性总结第二弹:id选择器
  9. CyclicBarrier的使用
  10. AttributeUsage