Wir hatten das gleiche Problem auf IIS 6 nach dem Upgrade von ASP.NET 3.5 auf ASP.NET 4.0 mit ASP.NET MVC. Alles funktionierte auf IIS 7 gut, aber IIS 6 gab uns ein Problem.
Das Problem war, dass die HttpContext.Current.Request.CurrentExecutionFilePath Eigenschaft ein anderes Ergebnis in IIS gab 6 und IIS 7:
- Url:
/Controller.mvc/Action/1/2
- IIS 6:
/Controller.mvc/Action/1/2
- IIS 7:
/Controller.mvc
die in Urls für die Charts wie Folge:
- IIS 6:
/Controller.mvc/Action/1/ChartImg.axd?i=chart_...
- IIS 7:
/ChartImg.axd?i=chart_...
Die ChartHttpHandler eine Funktion da drin hat, dass der Pfad der HttpContext.Current.Request.CurrentExecutionFilePath berechnet basierend off:
private static string GetHandlerUrl()
{
string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/");
if (!str.EndsWith("/", StringComparison.Ordinal))
{
str = str + "/";
}
return (str + "ChartImg.axd?");
}
Die Art, wie das ASP.NET-UrlRewriting funktionierte, da die Pfade zu ChartImg.axd immer noch .mvc enthielten, wurde anstelle des Chart-Handlers der MVC-Handler aufgerufen.
gab es 3 Möglichkeiten, wie wir gefunden, damit umzugehen (siehe unten):
- eine explizite Skriptzuordnung hinzufügen Für „.mvc“ der ASP.NET 4.0 dll
- einige zusätzliche hinzufügen ignorieren Routen der Routentabelle zu decken Permutationen
- die() des Controllers ausführen außer Kraft setzen und in eine Umleitung setzen zurück zu /ChartImg.axd
(1) Stellt sich heraus, dass, wenn wir eine Skriptzuordnung für .mvc über IIS 6.0 für .mvc die Anforderung hinzugefügt.CurrentExecutionFilePath würde als Root-Pfad berechnet bekommen, wie wir es statt wollte als den tieferen Pfad
- IIS 6.0-Manager
- Eigenschaften -> Home-Verzeichnis -> Konfiguration
- Mappings Registerkarte
- Executable: c: \ winnt \ microsoft.net \ Framework \ v4.0.30319 \ aspnet_isapi.dll, Erweiterung: .mvc
(2) Wir, dass die Anzeige gefunden Einige Routing-Tabelleneinträge würden funktionieren, aber wir mussten alle möglichen Tiefen in den Pfaden berücksichtigen, damit ASP.NET MVC die Datei ChartImg.axd ignoriert, wenn sie tief im Pfad und nicht im Stamm eingebettet wäre:
(3) durch das Überschreiben der Execute() auf alle Steuerungen durch einen Basis-Controller machen, dass alle unsere Steuerungen von erben, könnten wir global überschreiben die() Führen Sie für diese Situation zu erklären und zu/ChartImg umleiten. 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;
}
}
}
die zusätzliche RouteTable.Routes.IgnoreRoute hat den Trick für uns gemacht. – badMonkey