Sto usando il modulo di IIS 7 Rewrite per riscrivere un URL in ingresso come:ASP.NET MVC UrlHelper.GenerateUrl eccezione: "Non è possibile utilizzare una porta .. per uscire sopra la directory top"
a
http://server/application/controller/year/all
Tutto funziona bene, tranne quando, durante l'elaborazione della richiesta riscritto, io uso il metodo di MVC UrlHelper.GenerateUrl():
UrlHelper.GenerateUrl(
"Assets",
"Css",
"Asset",
new RouteValueDictionary(new { site = site.Name, assetPath = assetPath }),
RouteTable.Routes,
controllerContext.RequestContext,
false);
chiamata a questo metodo si traduce in un 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)
Guardando il RequestContext, sembra che tutti i percorsi di richiesta sono corrette (vale a dire, hanno i valori riscritti). Non riesco a capire perché stia cercando di uscire dalla directory di primo livello ... Non c'è nessun posto in cui stiamo usando .... in un percorso.
Ho anche assicurato che RewriteModule si trovi sopra il modulo UrlRouting in IIS.
Mentre posso accedere ai metodi framework, non riesco a esaminare nessuna delle variabili locali (in VS o WinDbg) perché è stato ottimizzato per il compilatore.
Qualche idea?
sto affrontando lo stesso problema e non hanno trovato una soluzione. Per ora sono solo i collegamenti ipertestuali hard-coding invece di usare Html.ActionLink dove ottengo l'eccezione. Hai trovato una soluzione? –
@Rob: non abbiamo trovato una soluzione. Sono stato in grado di rintracciare fino alla presenza dell'intestazione X_ORIGINAL_URL nella richiesta. IIS inserisce tale intestazione ogni volta che riscrive un URL. Utilizza quell'intestazione per cercare di annullare la riscrittura dell'URL, poiché probabilmente non si desidera che l'URL generato segua il formato riscritto. Ci viene appeso quando prende in considerazione l'url originale. Non ha molto senso * usare * sempre l'url originale - per noi, vogliamo solo che generi l'url e ignori quello originale. Non c'è modo che abbiamo scoperto di sovrascrivere questo comportamento. –
Ho finito per passare da una riscrittura a un reindirizzamento e questo ha risolto il problema. i nostri URL ora contengono l'area, che non è l'ideale, ma è più importante che il sito funzioni senza rovinare troppo il routing di MVC. –