关于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这个路径给改回来。

       

     




















  •  

     

     

    posted @ 2011-12-08 10:03  许志伟  阅读(638)  评论(1编辑  收藏  举报