Ich habe hier ein komisches Problem. Jeder weiß, dass Sie, wenn Sie den customErrors
Abschnitt von web.config verwenden , um eine benutzerdefinierte Fehlerseite zu erstellen, die entsprechende Einstellung vornehmen sollten Response.StatusCode
. Wenn ich beispielsweise eine benutzerdefinierte 404-Seite erstelle und sie 404.aspx nenne, kann ich <% Response.StatusCode = 404 %>
den Inhalt einfügen, damit er einen echten 404-Statusheader hat.
Folge mir so weit? Gut. Versuchen Sie dies jetzt auf IIS7. Ich kann es nicht zum Laufen bringen, Punkt. Wenn dies Response.StatusCode
auf der benutzerdefinierten Fehlerseite festgelegt ist, scheint IIS7 die benutzerdefinierte Fehlerseite vollständig zu überschreiben und zeigt eine eigene Statusseite an (falls Sie eine konfiguriert haben).
Hat jemand anderes dieses Verhalten gesehen und weiß vielleicht auch, wie man es umgeht? Es hat unter IIS6 funktioniert, daher weiß ich nicht, warum sich die Dinge geändert haben.
Hinweis: Dies ist nicht dasselbe wie das Problem in ASP.NET Custom 404, das 200 OK anstelle von 404 Not Found zurückgibt
Antworten:
Setzen Sie im Abschnitt system.webServer / httpErrors die vorhandene Antwort auf PassThrough:
Der Standardwert der vorhandenenResponse-Eigenschaft ist Auto:
Weitere Informationen: Was Sie vom benutzerdefinierten IIS7-Fehlermodul erwarten können
quelle
<httpErrors existingResponse="PassThrough" />
gleichwertigResponse.TrySkipIisCustomErrors
oder verhalten sie sich anders?Response.TrySkipIisCustomErrors
Ihnen erhalten Sie eine bessere Kontrolle darüber, wann benutzerdefinierte IIS-Fehler angezeigt werden sollen.Der einfachste Weg, um das Verhalten konsistent zu machen, besteht darin, den Fehler zu löschen und Response.TrySkipIisCustomErrors zu verwenden und auf true zu setzen. Dadurch wird die globale IIS-Fehlerseitenbehandlung innerhalb Ihrer Seite oder der globalen Fehlerbehandlungsroutine in Application_Error überschrieben.
Normalerweise sollten Sie dies in Ihrem Application_Error-Handler tun, der alle Fehler behandelt, die Ihre Application Error-Handler nicht abfangen.
Weitere Informationen finden Sie in diesem Blogbeitrag: http://www.west-wind.com/weblog/posts/745738.aspx
quelle
customError
in Web.config konfigurierte ausgelöst wird. MitResponse.TrySkipIisCustomErrors = true
bekomme ich das gleiche Verhalten: Die hässliche vom Server generierte Fehlerseite wird angezeigt. Wenn es auffalse
nichts eingestellt ist, passiert nichts - ein leeres Browserfenster.Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
customErrors mode="Off"
dass dies funktioniert. Wenn ich das mache, funktioniert die httpErrors existierende Antwort = "Auto" (Standardeinstellung) für mich ordnungsgemäß, wenn ich den Code in dieser Antwort verwende.Behoben: Es stellt sich heraus, dass "Detaillierte Fehler" aktiviert sein muss, damit IIS7 eine eventuell vorhandene Fehlerseite "durchläuft". Siehe http://forums.iis.net/t/1146653.aspx
quelle
Ich bin mir nicht sicher, ob dies von Natur aus ähnlich ist oder nicht, aber ich habe ein Problem gelöst, das an der Oberfläche ähnlich klingt, und hier ist, wie ich damit umgegangen bin.
Zunächst war der Standardwert für existierende Antwort (Auto) in meinem Fall die richtige Antwort, da ich benutzerdefinierte 404, 400 und 500 habe (ich könnte andere erstellen, aber diese drei reichen für meine Arbeit aus). Hier sind die relevanten Abschnitte, die mir geholfen haben.
Aus web.config:
Und
Von dort habe ich dies in Application_Error auf global.asax hinzugefügt:
Auf jeder meiner benutzerdefinierten Fehlerseiten musste ich den richtigen Antwortstatuscode angeben. In meinem Fall verwende ich eine benutzerdefinierte 404, um Benutzer an verschiedene Bereiche meiner Website zu senden. Daher möchte ich keinen 404-Statuscode zurückgeben, es sei denn, es handelt sich tatsächlich um eine tote Seite.
Jedenfalls habe ich es so gemacht. Hoffe das hilft jemandem.
quelle
Dieses Problem hat große Kopfschmerzen verursacht. Keiner der zuvor erwähnten Vorschläge allein hat es für mich gelöst, daher schließe ich meine Lösung ein. Für die Aufzeichnung verwendet unsere Umgebung / Plattform:
Insbesondere habe ich versucht, eine HTTP 404-Antwort zu erhalten, die den Benutzer auf unsere benutzerdefinierte 404-Seite umleitet (über die Web.config-Einstellungen).
Zuerst musste mein Code einen werfen
HttpException
. Die Rückgabe einesNotFoundResult
vom Controller hat nicht die gewünschten Ergebnisse erzielt.Dann musste ich sowohl die
customErrors
als auch diehttpError
Knoten in der Web.config konfigurieren....
Beachten Sie, dass ich das
existingResponse
as belassen habeAuto
, was sich von der bereitgestellten Lösung @sefl unterscheidet.Die
customErrors
Einstellungen schienen notwendig zu sein, um meine explizit ausgelösten zu verarbeitenHttpException
, während derhttpErrors
Knoten URLs behandelte, die außerhalb der in Globals.asax.cs angegebenen Routenmuster lagen.PS Mit diesen Einstellungen musste ich nicht einstellen
Response.TrySkipIisCustomErrors
quelle
TrySkipIisCustomErrors
ist nur ein Teil eines Puzzles. Wenn Sie benutzerdefinierte Fehlerseiten verwenden, aber auch RESTful-Inhalte basierend auf 4xx-Status bereitstellen möchten, liegt ein Problem vor. Das Festlegen der httpErrors.existingResponse von web.config auf "Auto" funktioniert nicht, da .net anscheinend immer einige Seiteninhalte an IIS liefert. Daher führt die Verwendung von "Auto" dazu, dass alle (oder zumindest einige) benutzerdefinierten Fehlerseiten nicht verwendet werden. Die Verwendung von "Ersetzen" funktioniert auch nicht, da die Antwort Ihren http-Statuscode enthält, der Inhalt jedoch leer oder mit einer benutzerdefinierten Fehlerseite gefüllt ist. Und das "PassThrough" schaltet das CEP tatsächlich aus, sodass es nicht verwendet werden kann.Wenn Sie also CEP in einigen Fällen umgehen möchten (durch Umgehen meine ich, dass Sie den Status 4xx mit einigen Inhalten zurückgeben), benötigen Sie einen zusätzlichen Schritt: Bereinigen Sie den Fehler:
Wenn Sie also die REST-Antwort (dh 400 - Bad Request) verwenden und Inhalte damit senden möchten, müssen Sie nur
TrySkipIisCustomErrors
irgendwo in Aktion festlegen undexistingResponse
im Abschnitt httpErrors in web.config auf "Auto" setzen. Jetzt:Wenn Sie den Status mit leerem Inhalt aus Ihrer Aktion zurückgeben möchten, wird dieser als leere Antwort behandelt und CEP wird angezeigt, sodass dieser Code noch verbessert werden kann.
quelle
Standardmäßig verwendet IIS 7 detaillierte benutzerdefinierte Fehlermeldungen, sodass ich davon ausgehen würde, dass Response.StatusCode 404.XX und nicht nur 404 entspricht.
Sie können IIS7 so konfigurieren, dass es die einfacheren Fehlermeldungscodes verwendet, oder Ihren Code ändern, der die detaillierteren Fehlermeldungen behandelt, die IIS7 bietet.
Weitere Informationen finden Sie hier: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx
Weitere Untersuchungen ergaben, dass ich es falsch herum hatte - detaillierte Nachrichten sind nicht standardmäßig aktiviert, aber möglicherweise wurden sie auf Ihrer Box aktiviert, wenn Sie die verschiedenen von Ihnen erwähnten Fehlermeldungen sehen.
quelle