5

En primer lugar, rápidamente lo que exactamente quiero lograr: traducir una excepción particular en el HTTP 404 para que ASP.NET pueda manejarlo más lejos.Convierta una excepción en respuesta HTTP 404 en Application_Error

estoy Manejo de excepciones en el ASP.NET (MVC2) de esta manera:

protected void Application_Error(object sender, EventArgs e) { 
     var err = Server.GetLastError(); 
     if (err == null) 
      return; 
     err = err.GetBaseException(); 

     var noObject = err as ObjectNotFoundException; 
     if (noObject != null) 
      HandleObjectNotFound(); 

     var handled = noObject != null; 
     if (!handled) 
      Logger.Fatal("Unhandled exception has occured in application.", err); 
    } 

    private void HandleObjectNotFound() { 
     Server.ClearError(); 
     Response.Clear(); 
     // new HttpExcepton(404, "Not Found"); // Throw or not to throw? 
     Response.StatusCode = 404; 
     Response.StatusDescription = "Not Found"; 
     Response.StatusDescription = "Not Found"; 
     Response.Write("The whole HTML body explaining whata 404 is??"); 
    } 

El problema es que no puedo configurar por defecto customErrors para trabajar con él. Cuando es on, entonces nunca lo redirige a la página especificada en customErrors: <error statusCode="404" redirect="404.html"/>.

También traté de subir new HttpExcepton(404, "Not Found") desde el controlador, pero luego el código de respuesta es 200 que no entiendo por qué.

Así que las preguntas son:

  1. ¿Cuál es la forma correcta de traducir AnException en respuesta HTTP 404?
  2. ¿Cómo funciona la sección customErrors al manejar excepciones en Application_Error?
  3. ¿Por qué arrojar HttpException (404) representa (en blanco) la página con el estado de éxito (200)?

Gracias,
Dmitriy.

Respuesta

2

En pocas palabras, si configura manualmente el estado de HTTP en Application_Error, pierde la posibilidad de utilizar el manejador de sección customErrors, ya que llama a Server.ClearError().

Maneja la excepción antes de Application_Error o deriva la excepción de HttpException.

  • ¿Cuál es la forma correcta de traducir AnException a la respuesta HTTP 404?

Es mejor manejar excepciones en el controlador. Puede introducir el controlador de clase base y manejar la mayoría de las excepciones en el atributo personalizado HandleError. Puede lanzar HttpException y será manejado adecuadamente por el manejador de sección customErrors.

También puede derivar su excepción ObjectNotFoundException de HttpException (404)

Application_Error es la última oportunidad de manejar una excepción. Solo tiene Response API para manejarlo. Puede establecer manualmente el código de estado y escribir en respuesta o desencadenar manualmente la redirección a la página de error personalizada o llamar a Server.TransferRequest() a un archivo html o aspx existente (no a la acción del controlador). En la versión actual de asp.net, no puede establecer ni cambiar Server.GetLastError en el método Application_Error solo recuperarlo o borrarlo.

  • ¿Cómo funciona la sección customErrors al manejar excepciones en Application_Error?

Llamando al servidor.ClearError() también error de solicitud de corriente limpia, por tanto, no es manejado por la sección customErrors manejador

  • Por qué tirar HttpException (404) hace (en blanco) la página con éxito (200) de estado?

No debe arrojar ninguna excepción en el método Application_Error. La excepción significa que su manejo de error falló.

+0

'Es mejor manejar excepciones en el controlador' - tal vez, pero no detectará excepciones que no sean de Mvc, que realmente necesito. 'deriva su excepción ObjectNotFoundException de HttpException' - no es posible, es la excepción de la capa de datos y no tiene nada que ver con HTTP. 'Puede establecer manualmente el código de estado y escribir en la respuesta' - en este caso no se iniciará la configuración' customErrors' 'desencadenar manualmente la redirección a la página de error personalizada' - ¿por qué demonios tenemos' * custom * Sección de errores. Una cosa tan simple, pero con tantos obstáculos, simplemente ejecute el controlador customError en la excepción dada. –

+0

Dmitriy, estoy de acuerdo contigo en que estará bien cambiar Server.GetLastError en Application_Error. Pero la API ASP.Net actual no permite hacerlo. "pero no detectará una excepción que no sea de Mvc, que sí necesito". - Debería poder detectar todas las excepciones en el nivel del controlador mediante el uso de estándares o la implementación del atributo HandleError personalizado. Intente evitar lanzar una excepción durante la representación de la vista. Si obtiene la excepción durante la representación de la vista, puede ser que este artículo pueda ser útil para usted: http://stackoverflow.com/questions/1074540/how-to-catch-exception-of-mvc-view –

+0

Andrej, I no puede detectar todas las excepciones en el nivel del controlador ya que hay páginas WebForms regulares como otras partes no MVC en la aplicación, por lo que el único lugar para manejar todos los errores es el objeto de aplicación global. Lo cual está bien, simplemente no puedo entender cómo "devolver" 404 desde allí, para que sea manejado por 'customErrors'. –

Cuestiones relacionadas