que era capaz de moverse este problema mediante el uso de la siguiente configuración en formularios web asp.net utilizando .NET 3.5.
El patrón que he implementado omite la solución de redireccionamiento personalizado de .NET en el archivo web.config, ya que he escrito el mío para manejar todos los escenarios con el código de estado HTTP correcto en el encabezado.
En primer lugar, la sección customErrors del web.config se ve así:
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
Esta configuración asegura que el modo CustomErrors está activada, un entorno que necesitaremos más adelante, y proporciona un todo-cosa-falla opción para el defaultRedirect de error.htm. Esto será útil cuando no tengo un controlador para el error específico, o hay algo parecido a una conexión de base de datos rota.
En segundo lugar, aquí está el caso asax error global:
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();
}
}
Este código está pasando fuera de la responsabilidad de manejar el error a otra clase. Si no se maneja el error y CustomErrors está activado, eso significa que tenemos un caso en el que estamos en producción y de alguna manera no se ha manejado un error. Lo borraremos aquí para evitar que el usuario lo vea, pero inicie sesión en Elmah para saber qué está pasando.
clase El applicationErrorHandler se ve así:
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;
}
Esta clase esencialmente utiliza el patrón de comandos para localizar el controlador de errores apropiado para el tipo de error que se emitió. Es importante usar Exception.GetBaseException() en este nivel, ya que casi todos los errores se envolverán en una excepción de nivel superior. Por ejemplo, si se ejecuta "throw new System.Exception()" desde cualquier página aspx, se recibirá una HttpUnhandledException en este nivel, no una excepción System.Exception.
El código "fábrica" es simple y se ve así:
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();
}
Al final, tengo una configuración de sistema de gestión de errores extensible. En cada uno de los "comportamientos" definidos, tengo una implementación personalizada para el tipo de error. Por ejemplo, se inspeccionará una excepción Http para el código de estado y se manejará de manera adecuada. Un código de estado 404 requerirá un Server.Transfer en lugar de un Request.Redirect, junto con el código de estado apropiado escrito en el encabezado.
Espero que esto ayude.
¿Qué significa el navegador? Uso el complemento Header Spy para Firefox. –
Header Spy Respuesta: HTTP/1.1 404 No encontrado Fecha: Dom, 07 Dec 2008 06:21:20 GMT –
¿Estás utilizando una página maestra? Tal vez eso es todo. Probaré una página sin utilizar una página maestra ... –