关于UrlRoutingModule 中的 context.RewritePath("~/UrlRouting.axd");

   UrlRoutingModule处理模块用于解析请求的URL,并选择相应的路由。

   很多人在看源码的时候  对下面的context.RewritePath("~/UrlRouting.axd");不解

 

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

        }

        if (!(routeHandler is StopRoutingHandler))

        {

            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 {

                OriginalPath = context.Request.Path,

                HttpHandler = httpHandler

            };

            context.Items[_requestDataKey] = data2;

            context.RewritePath("~/UrlRouting.axd");

        }

    }

}


其实这里涉及到ASP.NET的HTTP请求的管线问题
大家都知道 PostResolveRequestCache和PostMapRequestHandler还有个事件 ,事件顺序如下(来自MSDN)
  • 9.引发 PostResolveRequestCache 事件。

  • 10.根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

  • 11.引发 PostMapRequestHandler 事件。


    这个事件负责根据文件扩展名映射到具体的httphandle处理类,而MVC的URL信息没有具体的文件后缀名 为了使处理模块能够在iis7中实现路由,则采取了这么一种简单的解决办法。先把路径指向~/UrlRouting.axd,在此事件中会设置一个UrlRouting.axd类型的Handler避免报错,

    并在下一步事件中替换掉此处的Handler再把~/UrlRouting.axd这个路径给改回来。

       

     




















  •  

     

     

    你可能感兴趣的:(context)