ASP.NET MVC Preview生命周期分析(一)

做ASP.NET WebForm开发都知道,ASP.NET有复杂的生命周期,学习ASP.NET MVC就要深入理解它的生命周期。今天从CodePlex上下载了ASP.NET Preview 2 的 源代码,还有两个程序集Routing与Abstractions并未发布,不过这两个程序集的 类并不多,可以用NET反编译工具 Reflector解开来看看,可惜这两个程序集用的 是VS2008使用.net 3.5开发的,用了c# 3.0的很多特性,Reflector反编译不完全 。

ASP.NET MVC通过HttpModule(UrlRoutingModule)开始他的执行流程

<httpModules>
   <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing" />
</httpModules>

代码如下:

namespace System.Web.Routing
{
   using System;
  using System.Globalization;
  using System.Runtime.CompilerServices;
  using System.Security.Permissions;
  using System.Web;
  using System.Web.Resources;
  [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission (SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
  public class UrlRoutingModule : IHttpModule
  {
    private static readonly object _requestDataKey = new object();
    private System.Web.Routing.RouteCollection _routeCollection;
     protected virtual void Dispose()
    {
    }
     protected virtual void Init(HttpApplication application)
     {
      application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
       application.PostMapRequestHandler += new EventHandler (this.OnApplicationPostMapRequestHandler);
    }
     private void OnApplicationPostMapRequestHandler(object sender, EventArgs e)
    {
      HttpContextBase context = new HttpContextWrapper2(((HttpApplication) sender).Context);
       this.PostMapRequestHandler(context);
    }
     private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
    {
      HttpContextBase context = new HttpContextWrapper2(((HttpApplication) sender).Context);
       this.PostResolveRequestCache(context);
    }
     public virtual void PostMapRequestHandler(HttpContextBase context)
    {
      RequestData data = (RequestData) context.Items[_requestDataKey];
      if (data != null)
      {
        context.RewritePath (data.OriginalPath);
        context.Handler = data.HttpHandler;
      }
    }
    public virtual void PostResolveRequestCache(HttpContextBase context)
     {
      RouteData routeData = this.RouteCollection.GetRouteData(context);
      if (routeData != null)
      {
         IRouteHandler routeHandler = routeData.RouteHandler;
         if (routeHandler == null)
        {
           throw new InvalidOperationException(string.Format (CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
        }
        RequestContext requestContext = new RequestContext(context, routeData);
         IHttpHandler httpHandler = routeHandler.GetHttpHandler (requestContext);
        if (httpHandler == null)
         {
          throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));
        }
         RequestData data2 = new RequestData();
         data2.OriginalPath = context.Request.Path;
         data2.HttpHandler = httpHandler;
        context.Items [_requestDataKey] = data2;
        context.RewritePath ("~/UrlRouting.axd");
      }
    }
    void IHttpModule.Dispose()
    {
       this.Dispose();
    }
    void IHttpModule.Init (HttpApplication application)
    {
       this.Init(application);
    }
    public System.Web.Routing.RouteCollection RouteCollection
    {
      get
      {
        if (this._routeCollection == null)
        {
           this._routeCollection = RouteTable.Routes;
         }
        return this._routeCollection;
       }
      set
      {
         this._routeCollection = value;
      }
    }

}

时间: 2024-12-30 06:09:26

ASP.NET MVC Preview生命周期分析(一)的相关文章

ASP.NET MVC Preview生命周期分析(二)

回到MvcHandler的 ProcessRequest , DefaultControllerFactory.CreateController(RequestContext, requiredString) 来返回 IController 实例.下面看看 DefaultControllerFactory的代码: 通过反射来创建 Controller 实例 ,GetControllerType 里面做了些缓存处理,以此来避免频繁使用反射造成的性 能问题.继续 MvcHandler.Process

ASP.NET MVC Preview生命周期分析(三)

详细看看InvokeAction方式的执行: protected internal bool InvokeAction(string actionName) { return InvokeAction (actionName, new RouteValueDictionary()); } protected internal virtual bool InvokeAction(string actionName, RouteValueDictionary values) { if (String

ASP.NET AJAX客户端生命周期分析(理论篇)

一.引言 微软的ASP.NET AJAX框架,作为一个相对比较完善的AJAX框架,有许多方面值得我们作深入研究.本文中,我们将结合一个具体的例子试图探究ASP.NET AJAX框架的客户端生命周期过程. [注]阅读本文最好要结合"ASP.NET应用程序生命周期概述"和"ASP.NET页面生命周期概述"两篇文章共同学习. 二.ASP.NET AJAX客户端生命周期原理 因为ASP.NET AJAX框架在开发思路上极大地借鉴了ASP.NET 2.0的开发技术,而且将会被

ASP.NET服务器控件的生命周期分析_实用技巧

本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重写该方法为控件提供初始化逻辑.此后,页面框架将调用TrackViewState方法来跟踪视图状态.需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了.只有在控件定义

ASP.NET AJAX客户端生命周期分析(实践篇)

一.引言 在上篇中,我们对微软的ASP.NET AJAX框架的客户端生命周期过程作了理论上的分析.在本篇中,我们要结合一个具体示例针对页面的客户端生命周期期间有关重要事件的发生顺序进行剖析. 二.举例 (一)说明 下面的这个例子展示了在一个有两个嵌套的UpdatePanel控件的页面的客户端事件将被如何引发.请注意点击父面板中的按钮与内嵌的UpdatePanel控件中按钮之间的区别.在父面板中的按钮将引起父面板的更新,而嵌在内部的面板将被删除并重新创建.内嵌面板的按钮点击仅引起内嵌面板的更新.

IIS处理asp.net请求和asp.net的页面生命周期

当一个客户端页面访问IIS试图获取一些信息的时候,发生了什么事情?一个请求在通过了HTTP管道后又发生了什么?本文主要是描述这两个过程,即IIS处理asp.net请求和asp.net的页面生命周期.欢迎大家积极拍砖,共同学习,共同进步. 首先我们要弄清楚两个非常重要的概念: 1, worker process(w3wp.exe). worker process管理所有的来自客户端的请求并给出响应.它是IIS下asp.net应用程序的核心. 2, application pool. 它是worke

Asp.net页面的生命周期

asp.net|页面 介绍 Asp.net是微软.Net战略的一个组成部分.它相对以前的Asp有了很大的发展,引入了许多的新机制.本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好.更灵活地操纵Asp.net的作用. 当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件.在我们试图建立Asp.net页面的时候,这个执行周期是不必去考虑的,那样只会自讨苦吃.然而,如果被正确的

ASP.NET应用程序生命周期趣谈(一)

这几天一直在看ASP.NET应用程序生命周期,真是太难了,我理解起来费了劲了,但偏偏它又是那么重 要,所以我希望能给大家带来一篇容易理解又好用的文章来帮助学习ASP.NET应用程序生命周期.这篇就 是了. 当你访问博客园想看我的这篇文章的时候,这个请求就被博客园的WEB SERVER(IIS)接收到了.博客 园IIS看了一眼我的请求,"噢,是.aspx啊,给ASP.NET去处理吧,就把我这个请求给了ASP.NET,并且说 :"这个你来处理,你处理完了之后把HTML给我,我好给邱爽一个回

asp.net页面的生命周期是怎么样的,简单易懂点的,谢谢啊

问题描述 asp.net页面的生命周期是怎么样的,简单易懂点的,谢谢啊 解决方案 解决方案二:msdn上有详细描述:ASP.NET页生命周期概述http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx