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:
- ¿Cuál es la forma correcta de traducir
AnException
en respuesta HTTP404
? - ¿Cómo funciona la sección
customErrors
al manejar excepciones en Application_Error? - ¿Por qué arrojar HttpException (404) representa (en blanco) la página con el estado de éxito (200)?
Gracias,
Dmitriy.
'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. –
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 –
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'. –