Auf einer alten Site habe ich die Funktionsweise von CustomErrors durch Hinzufügen geändert redirectMode="ResponseRewrite"
(neu in 3.5 SP1):
<customErrors mode="RemoteOnly" defaultRedirect="Error.aspx" redirectMode="ResponseRewrite">
<error statusCode="404" redirect="404.aspx" />
</customErrors>
Die Sache ist: Es zeigt mir die allgemeine Fehlerseite (die, die Sie erhalten, wenn Sie nicht festlegen customErrors
. Wenn ich das redirectMode="ResponseRewrite"
Teil entferne , funktioniert es einwandfrei.
Ich bin sicher, dass 3.5 SP1 auf dem Server installiert ist, da ich auf anderen Sites, die auf demselben Server gehostet werden, dieselbe Einstellung verwende.
Irgendwelche Ideen?
quelle
Die einzige Möglichkeit, die für mich perfekt funktioniert hat, besteht darin, benutzerdefinierte Fehler zu deaktivieren und die Fehlerseiten von iis über web.config zu ersetzen. Es sendet den richtigen Statuscode mit der Antwort und hat den Vorteil, dass es nicht durch den MVC geht.
Hier ist der Code
Deaktivieren Sie benutzerdefinierte Fehler
<customErrors mode="Off" />
Ersetzen Sie die Fehlerseiten
<httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <remove statusCode="500" subStatusCode="-1" /> <error statusCode="404" path="Error404.html" responseMode="File" /> <error statusCode="500" path="Error.html" responseMode="File" /> </httpErrors>
Hinweis. Verwenden Sie
responsemode="file"
diese Option, wenn die URL ein direkter Link zu einer Datei istinfo: http://tipila.com/tips/use-custom-error-pages-aspnet-mvc
quelle
Was passiert ist, dass IIS den Fehlerstatuscode erkennt und anstelle Ihrer eigenen eine eigene Fehlerseite anzeigt. Um dies zu lösen, müssen Sie dies im Code hinter der Seite Ihrer Fehlerseite festlegen, um zu verhindern, dass IIS dies tut:
Response.TrySkipIisCustomErrors = true;
Dies funktioniert nur in IIS7 oder höher. In früheren Versionen von IIS müssen Sie mit den Einstellungen der Fehlerseite spielen.
quelle
Aufgrund des Vertrauens
Server.Transfer
scheint die interne Implementierung vonResponseRewrite
nicht mit MVC kompatibel zu sein.Dies scheint mir eine eklatante Funktionslücke zu sein, daher habe ich beschlossen, diese Funktion mithilfe eines HTTP-Moduls erneut zu implementieren, damit sie einfach funktioniert . Mit der folgenden Lösung können Sie Fehler behandeln, indem Sie wie gewohnt zu einer gültigen MVC-Route (einschließlich physischer Dateien) umleiten.
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"> <error statusCode="404" redirect="404.aspx" /> <error statusCode="500" redirect="~/MVCErrorPage" /> </customErrors>
Dies wurde auf den folgenden Plattformen getestet.
namespace Foo.Bar.Modules { /// <summary> /// Enables support for CustomErrors ResponseRewrite mode in MVC. /// </summary> public class ErrorHandler : IHttpModule { private HttpContext HttpContext { get { return HttpContext.Current; } } private CustomErrorsSection CustomErrors { get; set; } public void Init(HttpApplication application) { System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~"); CustomErrors = (CustomErrorsSection)configuration.GetSection("system.web/customErrors"); application.EndRequest += Application_EndRequest; } protected void Application_EndRequest(object sender, EventArgs e) { // only handle rewrite mode, ignore redirect configuration (if it ain't broke don't re-implement it) if (CustomErrors.RedirectMode == CustomErrorsRedirectMode.ResponseRewrite && HttpContext.IsCustomErrorEnabled) { int statusCode = HttpContext.Response.StatusCode; // if this request has thrown an exception then find the real status code Exception exception = HttpContext.Error; if (exception != null) { // set default error status code for application exceptions statusCode = (int)HttpStatusCode.InternalServerError; } HttpException httpException = exception as HttpException; if (httpException != null) { statusCode = httpException.GetHttpCode(); } if ((HttpStatusCode)statusCode != HttpStatusCode.OK) { Dictionary<int, string> errorPaths = new Dictionary<int, string>(); foreach (CustomError error in CustomErrors.Errors) { errorPaths.Add(error.StatusCode, error.Redirect); } // find a custom error path for this status code if (errorPaths.Keys.Contains(statusCode)) { string url = errorPaths[statusCode]; // avoid circular redirects if (!HttpContext.Request.Url.AbsolutePath.Equals(VirtualPathUtility.ToAbsolute(url))) { HttpContext.Response.Clear(); HttpContext.Response.TrySkipIisCustomErrors = true; HttpContext.Server.ClearError(); // do the redirect here if (HttpRuntime.UsingIntegratedPipeline) { HttpContext.Server.TransferRequest(url, true); } else { HttpContext.RewritePath(url, false); IHttpHandler httpHandler = new MvcHttpHandler(); httpHandler.ProcessRequest(HttpContext); } // return the original status code to the client // (this won't work in integrated pipleline mode) HttpContext.Response.StatusCode = statusCode; } } } } } public void Dispose() { } } }
Verwendung
Fügen Sie dies als letztes HTTP-Modul in Ihre web.config ein
<system.web> <httpModules> <add name="ErrorHandler" type="Foo.Bar.Modules.ErrorHandler" /> </httpModules> </system.web> <!-- IIS7+ --> <system.webServer> <modules> <add name="ErrorHandler" type="Foo.Bar.Modules.ErrorHandler" /> </modules> </system.webServer>
quelle
remapManagedRequestsTo
Attribut in Kombination mitskipManagedModules="true"
zu verwenden, kann es daher zu einer erheblichen Verzögerung kommen, bevor die Remap-Seite geladen wird. Ich konnte das Problem umgehen, indem ich das Modul über die App-Initialisierung lud .Ich weiß, dass diese Frage etwas alt ist, aber ich dachte, ich sollte darauf hinweisen, dass es keine statische Datei sein muss, damit dies funktioniert.
Ich bin auf eine ähnliche Sache gestoßen, und es geht nur darum, diesen Fehler in Ihrer Error.aspx zu finden. In unserem Fall lag dies daran, dass die verwendete Masterseite auf Sitzungsdaten beruhte und die Sitzung nicht verfügbar war, wenn ResponseRewrite festgelegt wurde unsere Error.aspx Seite.
Ich habe noch nicht herausgefunden, ob diese Nichtverfügbarkeit der Sitzung auf unsere spezifische App-Konfiguration oder einen "by Design" -Teil von ASP.net zurückzuführen ist.
quelle
Ich fand, dass das Problem in Error.aspx war. Ich kann immer noch nicht finden, was der eigentliche Fehler in error.aspx war, der das Problem verursacht.
Das Ändern der Seite in eine statische HTML-Datei löste das Problem.
quelle
Ich habe in aspx eine Fehlerseite erstellt, die die Abfrage an einen ASP.NET MVC-Controller überträgt. Sie können die Abfrage auf diese Aspx-Seite umschreiben und die Abfrage wird auf Ihren benutzerdefinierten Controller übertragen.
protected void Page_Load(object sender, EventArgs e) { //Get status code var queryStatusCode = Request.QueryString.Get("code"); int statusCode; if (!int.TryParse(queryStatusCode, out statusCode)) { var lastError = Server.GetLastError(); HttpException ex = lastError as HttpException; statusCode = ex == null ? 500 : ex.GetHttpCode(); } Response.StatusCode = statusCode; // Execute a route RouteData routeData = new RouteData(); string controllerName = Request.QueryString.Get("controller") ?? "Errors"; routeData.Values.Add("controller", controllerName); routeData.Values.Add("action", Request.QueryString.Get("action") ?? "Index"); var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData); IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(requestContext, controllerName); controller.Execute(requestContext); }
Weitere Details finden Sie hier: https://stackoverflow.com/a/27354140/143503
quelle
In meinem speziellen Fall hatte meine Fehlerseite eine Masterseite mit einem Benutzersteuerelement, das versuchte, die Sitzung zu verwenden. Wenn die Sitzung nicht verfügbar ist, wird eine HttpException angezeigt: "Der Sitzungsstatus kann nur verwendet werden, wenn enableSessionState entweder in einer Konfigurationsdatei oder in der Page-Direktive auf true gesetzt ist." Die einfachste Lösung besteht darin, zu statischem HTML zu wechseln. Die zweit einfachste Lösung besteht darin, eine einfachere Fehlerseite zu verwenden. Die schwierigste Lösung besteht darin, unglaublich sicher zu stellen, dass Ihre Fehlerseite nirgendwo Annahmen trifft (so dass die Sitzung beispielsweise keine Ausnahme auslöst) kann unmöglich Fehler aus.
quelle
Ich habe herausgefunden, dass Sie, wenn Sie redirectMode = "ResponseRewrite" verwenden, etwas im Umschreibbereich der Datei web.config hinzufügen müssen. Problem ist, wenn Ihre Website kaputt ist! Sie können keine URL-Umschreibung vornehmen, da Ihre Site nicht die "virtual.aspx" aufrufen kann, die Ihre Umschreibung übernimmt!
quelle
Laut @ Amilas Beitrag und Bestätigung und Vervollständigung dieses Beitrags habe ich das gleiche Problem, ich grabe viel bei Google, hatte aber keine Chance, die richtige Antwort zu finden. Das Problem ist, wenn Sie mit arbeiten
ASP.Net Web Application
, ob es sichMVC
um einen benutzerdefinierten Fehler handelt oder nicht, mit dem Sie auf die alte Art und Weise keinen benutzerdefinierten Fehler erzielen könnenWebform project
.Hier die Option, wenn Sie verwenden
ASP.Net Web Application
(ob es eine istMVC
oder nicht):Senario1: Ihre benutzerdefinierte Seite ist eine einfache
HTML
Datei und befindet sich inroot
:<configuration> <system.web> <customErrors mode="Off" /> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="ErrorPage.html" responseMode="File" /> </httpErrors> </system.webServer> </configuration>
Senario2: Ihre benutzerdefinierte Seite ist eine
aspx
Seite und wird platziert inroot
:<configuration> <system.web> <customErrors mode="Off" /> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="ErrorPage" responseMode="Redirect" /> </httpErrors> </system.webServer> </configuration>
Hinweis: Ich entferne die Aspx-Erweiterung aufgrund von
RouteConfig.cs
inASP.net application
. Sie können sie verwenden,ErrorPage.aspx
wenn Sie möchten. Sie ist optional.Senario3: Ihre benutzerdefinierte Seite ist eine
aspx
Seite und befindet sich in[ex: Page folder in The root (~/Page/ErrorPage.aspx)]
:Der Tipp hier, den ich bemerkt habe, ist , dass Sie die Root-Adressierung NICHT verwenden sollten
~/
. Also adressiere ich einfach ohne~/
Markierung:<configuration> <system.web> <customErrors mode="Off" /> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" path="Page/ErrorPage" responseMode="Redirect" /> </httpErrors> </system.webServer> </configuration>
quelle