当前位置 > 首页 > Asp.net

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

8/11/2012 10:48:00 PM来源:Asp.net

前言

  本文假定读者对 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 可以查看到其源码:

 1 [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] 2 public class UrlRoutingModule : IHttpModule 3 { 4     // Fields 5     private static readonly object _contextKey = new object(); 6     private static readonly object _requestDataKey = new object(); 7     private RouteCollection _routeCollection; 8   9     // Methods10     protected virtual void Dispose()11     {12     }13  14     protected virtual void Init(HttpApplication application)15     {16         if (application.Context.Items[_contextKey] == null)17         {18             application.Context.Items[_contextKey] = _contextKey;19             application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);20         }21     }22  23     private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)24     {25         HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);26         this.PostResolveRequestCache(context);27     }28  29     [Obsolete("This method is obsolete. Override the Init method to use the PostMapRequestHandler event.")]30     public virtual void PostMapRequestHandler(HttpContextBase context)31     {32     }33  34     public virtual void

  • 通过实例了解抽象工厂(一)数据组件层

    5/9/2007 10:59:00 PM

    摘要: 本文主要面向刚接触.Net不就的朋友,所以我尽量用通俗易懂的语言叙述。 文章通过一个简单的数据库操作示例阐述抽象工厂的实际应用。 阅读全文 落花游鸿 2007-05-07 01

  • 避免在实现IOleCommandTarget接口时的自动化错误

    7/6/2010 11:19:00 AM

    [原文作者]: Jared Parsons [原文链接]: Avoiding automation bugs when implementing IOleCommandTarget

  • VB中的冒号

    12/23/2009 4:46:00 PM

    阅读: 296 评论: 8 作者: cixiaofeng 发表于 2009-12-23 13:45 原文链接   关于VB中的冒号,给许多人的印象都是:“一行可书写几句语句&#

  • 最轻量,最简单的Ajax框架!你会说Ajax如此简单!

    12/29/2009 8:35:00 PM

    阅读: 283 评论: 2 作者: 侯锋 发表于 2009-12-29 19:14 原文链接 最轻量,最简单的Ajax框架! [ Houfeng.Web.Ajax ]

  • Using the CodeDom With .NET 3.5 Features

    1/28/2010 1:29:00 PM

    Here it is 2010 and I just noticed while trying to use the CodeDom features of .NET that it default

  • 搭建rails运行环境

    7/19/2009 10:13:00 PM

    .title {color:#ff7200;font-size:23px;line-height:28px} 今天重装系统,重新搭建rails的运行环境,因此以下命令都是面对最新出现

  • 开源框架RapidWebDev介绍

    1/4/2010 8:44:00 PM

    阅读: 1037 评论: 6 作者: AlexHe.cs 发表于 2010-01-04 14:50 原文链接 RapidWebDev( http://rapidwebdev.code

  • 5月30日,社区活动:SharePoint技术峰会

    5/27/2009 5:57:00 PM

    5月30日,我会参加SharePoint技术峰会,并贡献一个讲座:《SharePoint开发:模式与重构》(或者可以叫做《如何将模式应用到你的SharePoint程序,并重构它》)。这个讲座面向的对

  • 让LuaInterface 2.0.1支持中文

    4/2/2009 4:49:00 PM

    摘要: 最近也心血来潮研究Lua在.net下的运用,已有不少牛人在这方面做出了贡献,其中可以选择的封装库有LuaNet和LuaInterface,不过这2个库都有着不支持Unicode字符(汉字)

  • Linq To SQL 批量更新方法汇总

    7/12/2010 8:50:00 AM

    作者: CoolCode 发表于 2010-07-11 20:49 原文链接 阅读: 661 评论: 6 方法一、官方例子 地球人都知道的,也是不少 Linq To SQL