Я использую модуль перезаписи 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 находится над модулем UrlRouting в IIS.
Пока я могу входить в методы framework, я не могу проверить ни одну из локальных переменных (либо в VS или WinDbg), поскольку он был оптимизирован компилятором.
Любые мысли?