Ich habe Code im Ereignis der global.asax
Datei, Application_Error
der ausgeführt wird, wenn ein Fehler auftritt, und Details des Fehlers per E-Mail an mich selbst sendet.
void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
if (error.Message != "Not Found")
{
// Send email here...
}
}
Dies funktioniert einwandfrei, wenn ich es in Visual Studio ausführe. Wenn ich es jedoch auf unserem Live-Server veröffentliche, wird das Application_Error
Ereignis nicht ausgelöst.
Nach einigen Tests kann ich das Application_Error
Auslösen erhalten, wenn ich es einstelle. Wenn ich es customErrors="Off"
jedoch zurücksetze, wird customErrors="On"
das Ereignis nicht mehr ausgelöst.
Kann jemand vorschlagen, warum Application_Error
nicht feuern würde, wenn customErrors
in der aktiviert sind web.config
?
asp.net-mvc-3
application-error
WDuffy
quelle
quelle
Application_Error()
Methode nicht aufgerufen wurde. Ich erklärte auch meine endgültige Lösung.Antworten:
UPDATE
Da diese Antwort eine Lösung bietet, werde ich sie nicht bearbeiten, aber ich habe einen viel saubereren Weg gefunden, um dieses Problem zu lösen. Siehe meine andere Antwort für Details ...
Ursprüngliche Antwort:
Ich habe herausgefunden, warum die
Application_Error()
Methode nicht aufgerufen wird ...Global.asax.cs
Standardmäßig (wenn ein neues Projekt generiert wird) enthält eine MVC-Anwendung eine Logik in der
Global.asax.cs
Datei. Diese Logik wird zum Zuordnen von Routen und zum Registrieren von Filtern verwendet. Standardmäßig wird nur ein Filter registriert: einHandleErrorAttribute
Filter. Wenn customErrors aktiviert ist (oder über Remote-Anforderungen, wenn RemoteOnly festgelegt ist), weist das HandleErrorAttribute MVC an, nach einer Fehleransicht zu suchen, und ruft dieApplication_Error()
Methode niemals auf . Ich konnte keine Dokumentation dazu finden, aber diese wird in dieser Antwort auf programmers.stackexchange.com erläutert .Um die ApplicationError () -Methode für jede nicht behandelte Ausnahme aufzurufen, entfernen Sie einfach die Zeile, in der der HandleErrorAttribute-Filter registriert ist.
Das Problem ist nun: So konfigurieren Sie die customErrors, um das zu erhalten, was Sie möchten ...
Der Abschnitt customErrors ist standardmäßig
redirectMode="ResponseRedirect"
. Sie können das Attribut defaultRedirect auch als MVC-Route angeben. Ich habe einen ErrorController erstellt, der sehr einfach war, und meine web.config so geändert, dass sie so aussieht ...web.config
Das Problem bei dieser Lösung besteht darin, dass eine 302-Umleitung zu Ihren Fehler-URLs durchgeführt wird und diese Seiten dann mit einem 200-Statuscode antworten. Dies führt dazu, dass Google die Fehlerseiten indiziert, was schlecht ist. Es ist auch nicht sehr konform mit der HTTP-Spezifikation. Ich wollte nicht umleiten und die ursprüngliche Antwort mit meinen benutzerdefinierten Fehleransichten überschreiben.
Ich habe versucht mich zu ändern
redirectMode="ResponseRewrite"
. Leider unterstützt diese Option keine MVC-Routen , nur statische HTML-Seiten oder ASPX. Ich habe zuerst versucht, eine statische HTML-Seite zu verwenden, aber der Antwortcode war immer noch 200, aber zumindest wurde er nicht umgeleitet. Ich habe dann eine Idee von dieser Antwort ...Ich habe mich entschlossen, MVC wegen Fehlerbehandlung aufzugeben. Ich habe ein
Error.aspx
und ein erstelltPageNotFound.aspx
. Diese Seiten waren sehr einfach, aber sie hatten ein Stück Magie ...Dieser Block weist die Seite an, mit dem richtigen Statuscode bedient zu werden. Grob gesagt habe ich
HttpStatusCode.NotFound
stattdessen auf der Seite PageNotFound.aspx verwendet . Ich habe meine web.config so geändert, dass sie so aussieht ...Es hat alles perfekt funktioniert!
Zusammenfassung:
filters.Add(new HandleErrorAttribute());
Application_Error()
Methode, um Ausnahmen zu protokollierenEs gibt ein paar Nachteile, die ich bei dieser Lösung bemerkt habe.
Es gibt Workarounds für diese Probleme, aber ich war nicht besorgt genug, um zusätzliche Arbeit zu leisten.
Ich hoffe das hilft allen!
quelle
<customErrors mode="Off" />
. Nachdemfilters.Add(new HandleErrorAttribute());
entfernt oder nicht , keine Wirkung.Ich habe dieses Problem gelöst, indem ich einen ExceptionFilter erstellt und den Fehler dort anstelle von Application_Error protokolliert habe. Sie müssen lediglich einen Aufruf in in RegisterGlobalFilters hinzufügen
log4netExceptionFilter.cs
Global.asax.cs
quelle
Ich habe einen Artikel gefunden, der eine viel sauberere Methode zum Erstellen benutzerdefinierter Fehlerseiten in einer MVC3-Webanwendung beschreibt, die die Protokollierung der Ausnahmen nicht verhindert.
Die Lösung besteht darin, das
<httpErrors>
Element des<system.webServer>
Abschnitts zu verwenden.Ich habe meine Web.config so konfiguriert ...
Ich baute auch
customErrors
zu habenmode="Off"
(wie durch den Artikel vorgeschlagen).Dadurch werden die Antworten durch die Aktionen eines ErrorControllers überschrieben. Hier ist dieser Controller:
Die Ansichten sind sehr einfach. Ich habe nur die Standard-Razor-Syntax verwendet, um die Seiten zu erstellen.
Das allein sollte ausreichen, um benutzerdefinierte Fehlerseiten mit MVC zu verwenden.
Ich musste auch Ausnahmen protokollieren, damit ich die Lösung von Mark für die Verwendung eines benutzerdefinierten ExceptionFilter gestohlen habe ...
Als letztes müssen Sie den Ausnahmefilter in Ihrer Datei Global.asax.cs registrieren :
Dies scheint eine viel sauberere Lösung zu sein als meine vorherige Antwort und funktioniert, soweit ich das beurteilen kann, genauso gut. Ich mag es besonders, weil ich nicht das Gefühl hatte, gegen das MVC-Framework zu kämpfen. Diese Lösung nutzt es tatsächlich!
quelle
HTTP Error 500.0 - Internal Server Error The page cannot be displayed because an internal server error has occurred.
Fehlerbildschirm, nicht meine angeforderte/Error/Index
SeiteTo able to overwrite global settings in global IIS settings (file: C:\Windows\System32\inetsrv\config \applicationHost.config) should be: <section name="httpErrors" overrideModeDefault="Allow" />
Im Falle von ASP.NET MVC5 verwenden
Sie können es in finden
FilterConfig.cs
vonApp_Start
Ordnern.quelle
Ich mag Marks Antwort mit dem ExceptionFilter, aber eine andere Option, wenn alle Ihre Controller von demselben Basiscontroller stammen, besteht darin, OnException in Ihrem Basiscontroller einfach zu überschreiben. Dort können Sie sich anmelden und E-Mails senden. Dies hat den Vorteil, dass Sie alle Abhängigkeiten verwenden können, die Sie bereits mit Ihrem IoC-Container in Ihren Basis-Controller eingefügt haben.
Sie können Ihr IoC weiterhin mit einem IExceptionFilter verwenden, die Konfiguration Ihrer Bindungen ist jedoch etwas schwieriger.
quelle
Soweit ich weiß, übergeben Sie die Kontrolle an die im URL-Parameter angegebene Seite, und Ihre Ereignisbenachrichtigung wird hier und nicht in Application_Error angezeigt
Viele Informationen finden Sie hier: http://support.microsoft.com/kb/306355
quelle
Um dies zu umgehen, habe ich die benutzerdefinierten Fehler deaktiviert und alle Fehler aus dem Application_Error-Ereignis in global.asax behandelt. Mit MVC ist es etwas schwierig, da ich keine 301-Umleitung zurückgeben wollte, sondern geeignete Fehlercodes zurückgeben wollte. Weitere Details finden Sie in meinem Blog unter http://www.wduffy.co.uk/blog/using-application_error-in-asp-net-mvcs-global-asax-to-handle-errors/, aber der endgültige Code lautet nachfolgend aufgeführten...
Und hier ist der Controller
quelle
Response.StatusCode = ###;
wurden die integrierten MVC-Fehlerseiten bei angezeigtC:\inetpub\custerr\en-US
. Mir hat auch die Idee nicht gefallen, HttpHandler oder Controller manuell über meine Application_Error () -Methode aufzurufen. Ich bin froh, dass Sie eine Lösung für Ihr Problem gefunden haben. Ich weiß, welche Kopfschmerzen mir das bereitet hat.Dieser Blogeintrag hat mir geholfen:
http://asp-net.vexedlogic.com/2011/04/23/asp-net-maximum-request-length-exceeded/
Wenn Sie IIS 7.0 oder höher verwenden, können Sie Ihre Web.config-Datei ändern, um zu große Anforderungen zu verarbeiten. Es gibt einige Einschränkungen, aber hier ist ein Beispiel:
Weitere Details zu diesen Konfigurationsdateielementen finden Sie hier:
http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering/requestLimits
Der Statuscode 404.13 ist als "Inhaltslänge zu groß" definiert. Eine wichtige Sache zu beachten ist, dass die
maxAllowedContentLength
in Bytes angegeben wird. Dies unterscheidet sich von dermaxRequestLength
Einstellung in dem<system.web>
Abschnitt, der in Kilobyte angegeben ist.Beachten Sie auch, dass das
path
Attribut ein absoluter Pfad sein muss, wenn dies der FallresponseMode
istRedirect
. Stellen Sie daher gegebenenfalls den Namen des virtuellen Verzeichnisses voran. Die informativen Antworten von Jesse Webb zeigen, wie man das machtresponseMode="ExecuteURL"
, und ich würde denken, dass dieser Ansatz auch gut funktionieren würde.Dieser Ansatz funktioniert nicht, wenn Sie mit dem Visual Studio Development Server (Cassini, dem in Visual Studio integrierten Webserver) entwickeln. Ich gehe davon aus, dass es in IIS Express funktionieren würde, aber das habe ich nicht getestet.
quelle
Ich hatte das gleiche Problem, bei dem ich
Application_Error()
nicht getroffen wurde. Ich habe alles versucht, bis ich endlich durchging, was geschah. Ich hatte einen benutzerdefinierten Code in einem ELMAH-Ereignis, der JSON zu der gesendeten E-Mail hinzufügte, und es gab einen Nullfehler darin!Durch die Behebung des internen Fehlers konnte der Code
Application_Error()
wie erwartet mit dem Ereignis fortfahren .quelle