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