Używam modułu IIS 7 Rewrite przepisać przychodzące url podobny:ASP.NET MVC UrlHelper.GenerateUrl wyjątek: "Nie można użyć czołowym .. aby wyjść powyżej górnej katalogu"
do
http://server/application/controller/year/all
Wszystko działa poprawnie, z wyjątkiem sytuacji, gdy przetwarzanie przepisany wniosek, używam UrlHelper.GenerateUrl metody MVC jest():
UrlHelper.GenerateUrl(
"Assets",
"Css",
"Asset",
new RouteValueDictionary(new { site = site.Name, assetPath = assetPath }),
RouteTable.Routes,
controllerContext.RequestContext,
false);
Wywołanie tej metody wyniki w 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)
Patrząc na RequestContext, wydaje się, że wszystkie ścieżki są poprawne żądanie (czyli mają przepisane wartości). Nie mogę się domyślić, dlaczego próbuje wyjść z katalogu najwyższego poziomu ... Nigdzie nie używamy ... na ścieżce.
Upewniłem się również, że RewriteModule znajduje się powyżej modułu UrlRouting w IIS.
Chociaż mogę wejść do metod ramowych, nie mogę zbadać żadnej ze zmiennych lokalnych (w VS lub WinDbg), ponieważ jest ona zoptymalizowana pod kątem kompilacji.
Jakieś myśli?
Mam do czynienia z tym samym problemem i nie znalazłem rozwiązania. Na razie jestem po prostu twardym kodowaniem hiperłącza zamiast używania Html.ActionLink, gdzie dostaję wyjątek. Znalazłeś rozwiązanie? –
@Rob: nie znaleźliśmy rozwiązania. Udało mi się go znaleźć w nagłówku X_ORIGINAL_URL w żądaniu. IIS umieszcza ten nagłówek tam, gdzie przepisuje adres URL. Używa tego nagłówka, aby spróbować cofnąć przepisanie adresu URL, ponieważ prawdopodobnie nie chcesz, aby wygenerowany adres URL był zgodny z zapisanym formatem. Odkłada się na nas, gdy bierze pod uwagę oryginalny adres URL. Nie ma większego sensu, aby * zawsze * używać oryginalnego adresu URL - dla nas, chcemy tylko, aby wygenerował URL i zignorował oryginalny. Nie ma sposobu, abyśmy uznali to zachowanie za nadrzędne. –
Skończyło się przejście z przepisywania na przekierowanie i to naprawiło problem. nasze adresy URL zawierają teraz obszar, który nie jest idealny, ale ważniejsze jest to, aby strona działała bez zbytniego wkręcania w routing MVC. –