【发布时间】:2011-04-19 02:02:13
【问题描述】:
我正在使用 IIS 7 重写模块来重写传入的 url,例如:
到
http://server/application/controller/year/all
一切正常,除了在处理重写的请求时,我使用 MVC 的 UrlHelper.GenerateUrl() 方法:
UrlHelper.GenerateUrl(
"Assets",
"Css",
"Asset",
new RouteValueDictionary(new { site = site.Name, assetPath = assetPath }),
RouteTable.Routes,
controllerContext.RequestContext,
false);
调用此方法会导致 HttpException:
System.Web.HttpException: Cannot use a leading .. to exit above the top directory.
at System.Web.Util.UrlPath.ReduceVirtualPath(String path)
at System.Web.Util.UrlPath.Reduce(String path)
at System.Web.VirtualPath.Combine(VirtualPath relativePath)
at System.Web.VirtualPathUtility.Combine(String basePath, String relativePath)
at System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
查看RequestContext,似乎所有请求路径都是正确的(即,具有重写的值)。我似乎无法弄清楚为什么它试图退出顶级目录......我们没有在任何地方使用......在路径中。
我还确保 RewriteModule 位于 IIS 中的 UrlRouting 模块上方。
虽然我可以进入框架方法,但我无法检查任何局部变量(在 VS 或 WinDbg 中),因为它已经过编译器优化。
有什么想法吗?
【问题讨论】:
-
我遇到了同样的问题,还没有找到解决方案。现在我只是对超链接进行硬编码,而不是使用 Html.ActionLink 我得到异常的地方。你找到解决办法了吗?
-
@Rob:我们没有找到解决方案。我能够追踪到请求中是否存在 X_ORIGINAL_URL 标头。 IIS 在重写 url 时将该标头放在那里。它使用该标头尝试撤消对 url 的重写,因为您可能不希望生成的 url 遵循重写的格式。当它考虑到原始网址时,它会为我们挂断。 总是 使用原始 url 没有多大意义 - 对我们来说,我们只希望它生成 url 并忽略原始 URL。我们发现无法覆盖此行为。
-
我最终从重写切换到重定向,这解决了问题。我们的 URL 现在包含该区域,这并不理想,但更重要的是该站点可以正常工作,而不会过多地与 MVC 的路由混淆。
-
不确定这是否有帮助,但我也遇到了这个问题,最后调用了重载的UrlHelper.GenerateUrl() method,它也将主机名作为参数。这确实意味着我必须将主机名保留在配置中并传递它,但它似乎有助于 url 重写...... :)
-
arg,我曾经处理过这个问题,但不记得了……我的大脑一片空白。无论如何,如果你愿意使用 rewrite 模块,为什么不使用 MVC 的路由呢?
标签: asp.net asp.net-mvc-2 url-rewriting