ich war in der Lage zu umgehen Dieses Problem, indem Sie das folgende Setup in Asp.net-Webformularen mit .NET 3.5 verwenden.
Das Muster, das ich implementiert habe, umgeht die benutzerdefinierte Redirect-Lösung von .NET in der web.config, da ich meine eigene geschrieben habe, um alle Szenarien mit dem richtigen HTTP-Statuscode in der Kopfzeile zu behandeln.
Zuerst die Custom Abschnitt sieht web.config wie folgt aus:
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
Diese Einstellung sorgt dafür, dass Custom-Modus eingeschaltet ist, eine Einstellung wir später brauchen werden, und bietet ein All-else-Ausfall Option für die defaultRedirect von error.htm. Dies wird nützlich sein, wenn ich keinen Handler für den spezifischen Fehler habe oder etwas in Richtung einer unterbrochenen Datenbankverbindung ist.
Zweitens ist hier das globale asax Fehlerereignis:
protected void Application_Error(object sender, EventArgs e)
{
HandleError();
}
private void HandleError()
{
var exception = Server.GetLastError();
if (exception == null) return;
var baseException = exception.GetBaseException();
bool errorHandled = _applicationErrorHandler.HandleError(baseException);
if (!errorHandled) return;
var lastError = Server.GetLastError();
if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
Server.ClearError();
}
}
Dieser Code passing off wird die Verantwortung für die Fehler in einer anderen Klasse der Handhabung. Wenn der Fehler nicht behandelt wird und CustomErrors aktiviert ist, bedeutet dies, dass wir einen Fall haben, in dem wir produktiv arbeiten und ein Fehler nicht behoben wurde. Wir werden es hier löschen, um zu verhindern, dass der Benutzer es sieht, aber melde es in Elmah an, damit wir wissen, was vor sich geht.
Die applicationErrorHandler Klasse sieht wie folgt aus:
public bool HandleError(Exception exception)
{
if (exception == null) return false;
var baseException = exception.GetBaseException();
Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);
if (!HttpContext.Current.IsCustomErrorEnabled) return false;
try
{
var behavior = _responseBehaviorFactory.GetBehavior(exception);
if (behavior != null)
{
behavior.ExecuteRedirect();
return true;
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
return false;
}
Diese Klasse im Wesentlichen den Befehl Muster verwendet den entsprechenden Fehlerbehandlung für die Art des Fehlers zu finden, die ausgegeben wird. Es ist wichtig, Exception.GetBaseException() auf dieser Ebene zu verwenden, da fast jeder Fehler in eine höhere Ausnahme eingeschlossen wird. Wenn Sie z. B. "new System.Exception()" von einer beliebigen aspx-Seite auslösen, wird eine HttpUnhandledException auf dieser Ebene empfangen, keine System.Exception.
Die „Fabrik“ Code ist einfach und sieht wie folgt aus:
public ResponseBehaviorFactory()
{
_behaviors = new Dictionary<Type, Func<IResponseBehavior>>
{
{typeof(StoreException),() => new Found302StoreResponseBehavior()},
{typeof(HttpUnhandledException),() => new HttpExceptionResponseBehavior()},
{typeof(HttpException),() => new HttpExceptionResponseBehavior()},
{typeof(Exception),() => new Found302DefaultResponseBehavior()}
};
}
public IResponseBehavior GetBehavior(Exception exception)
{
if (exception == null) throw new ArgumentNullException("exception");
Func<IResponseBehavior> behavior;
bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);
//default value here:
if (!tryGetValue)
_behaviors.TryGetValue(typeof(Exception), out behavior);
if (behavior == null)
Elmah.ErrorSignal.FromCurrentContext().Raise(
new Exception(
"Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
exception));
return behavior();
}
Am Ende, ich habe Schema Setup eine erweiterbare Fehlerbehandlung. In jedem der "Verhaltensweisen", die definiert sind, habe ich eine benutzerdefinierte Implementierung für den Fehlertyp. Zum Beispiel wird eine HTTP-Ausnahme für den Statuscode überprüft und entsprechend behandelt. Ein 404-Statuscode erfordert einen Server.Transfer anstelle von Request.Redirect zusammen mit dem entsprechenden Statuscode, der in der Kopfzeile geschrieben ist.
Hoffe, das hilft.
Was sagt der Browser? Ich benutze den Addon Header Spy für Firefox. –
Header Spy Antwort: HTTP/1.1 404 Not Found Datum: So, 07 Dez 2008 06:21:20 GMT –
Verwenden Sie eine Masterseite? Vielleicht ist es das. Ich werde eine Seite versuchen, ohne eine Masterseite zu verwenden ... –