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); } } }