Abbiamo avuto questo stesso problema su IIS 6 dopo l'aggiornamento da ASP.NET 3.5 a ASP.NET 4.0 con ASP.NET MVC. Tutto stava funzionando bene su IIS 7, ma IIS 6 ci ha dato un problema.
Il problema è che la proprietà HttpContext.Current.Request.CurrentExecutionFilePath dato un risultato diverso in IIS 6 e IIS 7:
- URL:
/Controller.mvc/Action/1/2
- IIS 6:
/Controller.mvc/Action/1/2
- IIS 7:
/Controller.mvc
che ha portato gli URL per i grafici come:
0.123.516,41 mila
- IIS 6:
/Controller.mvc/Action/1/ChartImg.axd?i=chart_...
- IIS 7:
/ChartImg.axd?i=chart_...
Il ChartHttpHandler ha una funzione in là che calcola il percorso base al largo la HttpContext.Current.Request.CurrentExecutionFilePath:
private static string GetHandlerUrl()
{
string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/");
if (!str.EndsWith("/", StringComparison.Ordinal))
{
str = str + "/";
}
return (str + "ChartImg.axd?");
}
Il modo in cui l'URL UrlRewriting di ASP.NET funzionava, poiché i percorsi di ChartImg.axd avevano ancora .mvc in essi, il gestore MVC veniva richiamato invece del gestore del grafico.
c'erano 3 modi abbiamo trovato a che fare con esso (vedi sotto per i dettagli):
- Aggiungere un mapping di script esplicito per ".mvc" al ASP.NET 4.0 dll
- Aggiungete un po 'aggiuntiva ignorare le rotte per la tabella di route per coprire permutazioni
- sovrascrivere il execute() di controller e mettere in un reindirizzamento al /ChartImg.axd
(1) Si scopre che se abbiamo aggiunto una mappa di script per .mvc tramite IIS 6.0 per .mvc la richiesta.CurrentExecutionFilePath otterrebbe calcolato come il percorso della directory principale come volevamo che invece di come il percorso più profondo
- Gestione IIS 6.0
- Proprietà -> Home directory -> Configurazione
- Mapping scheda
- eseguibili: C: \ winnt \ microsoft.net \ framework \ v4.0.30319 \ aspnet_isapi.dll, Extension: .mvc
(2) Abbiamo scoperto che annuncio le voci della tabella di routing funzionerebbero, ma dovevamo tenere conto di tutte le profondità possibili nei percorsi per far sì che ASP.NET MVC ignorasse ChartImg.axd se fosse profondamente incorporato nel percorso e non nella radice:
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{c}/{resource}.axd/{*pathInfo}");
RouteTable.Routes.IgnoreRoute("{a}/{b}/{c}/{d}/{resource}.axd/{*pathInfo}");
(3) eseguendo l'override del Execute() su tutti i nostri controllori facendo un controller di base che tutti i nostri controllori ereditano da, potremmo ignorare a livello globale l'Execute() per conto di questa situazione e reindirizzare a/ChartImg. axd
public partial class MyController: Controller
{
protected override void Execute(RequestContext cc)
{
// the url for chartimg.axd to be in the application root. /Controller.mvc/Action/Param1/ChartImg.axd gets here first,
// but we want it to go to /ChartImg.axd, in which case the IgnoreRoute does work and the chart http handler does it's thing.
if (cc.HttpContext.Request.Url.AbsoluteUri.Contains("ChartImg.axd"))
{
var url = new UriBuilder(cc.HttpContext.Request.Url);
url.Path = "/ChartImg.axd";
cc.HttpContext.Response.Redirect(url.ToString());
return;
}
}
}
l'ulteriore RouteTable.Routes.IgnoreRoute ha fatto il trucco per noi. – badMonkey