其他分享
首页 > 其他分享> > .NET MVC 的执行原理 原文地址:http://www.cnblogs.com/landeanfen/p/5989092.html

.NET MVC 的执行原理 原文地址:http://www.cnblogs.com/landeanfen/p/5989092.html

作者:互联网

1、网页发出http请求,请求被IhttpModule(MVC实现类为UrlRoutingModule)拦截。

  拦截方式:通过注册HTTPApplication对象的PostResolveRequestCache事件来实现拦截 (URLRoutingModule 的Init函数需要传入HTTPApplication对象进行调用)

2、将HttpContext对象封装成HTTPContextWrapper对象。

  封装方式:UrlRoutingModule的init函数调用的时候会new一个HTTPContextWrapper对象,需要传入HttpContext对象。

3、根据当前HttpContext,从Routes集合中获取与当前URL相符的RouteData对象

  获取方式:PostResolveRequestCache执行过程中,会使用RouteCollection.GetRouteData获取RouteData对象。

4、将HttpContext对象和RouteData对象封装成RequestContext对象

  封装方式:PostResolveRequestCache执行中,会通过HttpContext对象和RouteData对象创建RequestContext对象。

5、根据RequestContext对象获取IHTTPHandler(MVC实现类为MVCHandler)对象。

6、执行MVCHandler,通过反射的方式激活controller,调用action,最后返回数据给View。

流程如下图:

 

 

 public virtual void PostResolveRequestCache(HttpContextBase context)
        {
            //1.传入当前上下文对象,得到与当前请求匹配的RouteData对象
            RouteData routeData = this.RouteCollection.GetRouteData(context);
            if (routeData != null)
            {
                //2.从RouteData对象里面得到当前的RouteHandler对象。其实这里的RouteHandler属性对应就是一个MvcRouteHandler的对象。
                IRouteHandler routeHandler = routeData.RouteHandler;
                if (routeHandler == null) throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, SR.GetString("UrlRoutingModule_NoRouteHandler"), new object[0]));
                if (!(routeHandler is StopRoutingHandler))
                {
                    //3.根据HttpContext和RouteData得到RequestContext对象
                    RequestContext requestContext = new RequestContext(context, routeData);
                    context.Request.RequestContext = requestContext;

                    //4.根据RequestContext对象得到处理当前请求的HttpHandler(MvcHandler)。
                    IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
                    if (httpHandler == null)
                    {
                        object[] args = new object[] { routeHandler.GetType() };
                        throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, SR.GetString("UrlRoutingModule_NoHttpHandler"), args));
                    }
                    if (httpHandler is UrlAuthFailureHandler)
                    {
                        if (!FormsAuthenticationModule.FormsAuthRequired) throw new HttpException(0x191, SR.GetString("Assess_Denied_Description3"));
                        UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current, this);
                    }
                    else
                        //5.请求转到HttpHandler进行处理(进入到ProcessRequest方法)。这一步很重要,由这一步开始,请求才由UrlRoutingModule转到了MvcHandler里面
                        context.RemapHandler(httpHandler);
                }
            }
        }

 

标签:www,http,cnblogs,RequestContext,对象,RouteData,context,new,HttpContext
来源: https://www.cnblogs.com/tonnyking/p/12579896.html