当前位置:编程学习 > C#/ASP.NET >>

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

}
详细请看这里:http://www.netcsharp.cn/showtopic-447.aspx --------------------编程问答-------------------- 做蘑菇头难呐~~~发个帖都没人UP --------------------编程问答-------------------- UP.. --------------------编程问答-------------------- up
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,