您的位置:首页 > 编程语言 > ASP

Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子

2012-08-11 22:51 741 查看

前言

  本文假定读者对 HttpModule 、HttpHandler和IIS的处理流程有一定的了解,如果为了解可以参考以下链接。文中大部分代码通过Reflector反编译 System.Web.dll 得到,.net 版本为4.0

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

IIS 7.0 的 ASP.NET 应用程序生命周期概述

HTTP 处理程序和 HTTP 模块概述

Asp.net MVC 程序虽然开发的模式不同,但是其本质上还是 Asp.net。其利用了HttpModule 和 HttpHandler 做了扩展,可以参考博客园里的大牛——Artech 相关系列文章。

本文主要关注UrlRoutingModule 、MvcRouteHandler 两个类的源代码,进而分析客户的请求是如何到达MvcHandler 的。

Asp.net MVc 程序启动流程 需要关注的行为

1、Application启动时先通过RouteTable把URL映射到Handler

2、通过UrlRouting Module 这个HttpModule 拦截用户请求。

我们知道,HttpModule 是注册在 Web.config 中的,可是当你打开Asp.net MVc 程序的Web .Config 时 却没有发现该配置节,原因是:"它已经默认的写在全局的中"。应此 你可以在 “$\Windows\Microsoft.NET\Framework\版本号\Config\Web.config“ 中找到 " <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />”

UrlRoutingModule 源码

UrlRoutingModule 位于 System.web.dll 文件中,利用Reflector 可以查看到其源码:

路由注册

void Application_Start(object sender, EventArgs e)
{
RegRoutes(RouteTable.Routes);
}

private void RegRoutes(RouteCollection routeCollection)
{
routeCollection.MapWheelRoute(null,
"{controller}/{action}/{*id}",
new { controller = "Home", action = "index", id = 1 });
}


  完成最后我们还需要组成自定义的HttpModule

在Web.Config 中添加如下配置:

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="WheelRouting" type="WheelRouting.WheelRoutingModule,WheelRouting"/>
</modules>

</system.webServer>


关于 HttpModule的介绍 可以参考:演练:创建和注册自定义 HTTP 模块

下面是运行结果:



Controller默认值为 Home Action 默认值为 index



源码:点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: