2012-04-20 11 views
5

Me estoy poniendo en práctica los errores personalizados en mi aplicación MVC3, su encendido en el web.config:¿Los errores personalizados funcionan para HttpCode 403 pero no 500?

<customErrors mode="On"> 
    <error statusCode="403" redirect="/Errors/Http403" /> 
    <error statusCode="500" redirect="/Errors/Http500" /> 
</customErrors> 

Mi controlador es muy simple, con los correspondientes puntos de vista con nombres correctos:

public class ErrorsController : Controller 
{ 
    public ActionResult Http403() 
    { 
     return View("Http403"); 
    } 

    public ActionResult Http500() 
    { 
     return View("Http500"); 
    } 
} 

para poner a prueba, estoy tirando excepciones en otro controlador:

public class ThrowingController : Controller 
{ 
    public ActionResult NotAuthorised() 
    { 
     throw new HttpException(403, ""); 
    } 

    public ActionResult ServerError() 
    { 
     throw new HttpException(500, ""); 
    } 
} 

Las 403 obras - me redirigen a mi costumbre "/ Errores/Http403".

El 500 no funciona: en su lugar, me redireccionan a la página de error predeterminada en la carpeta compartida.

¿Alguna idea?

Respuesta

4

Tengo 500 errores en marcha y funcionando mediante el uso de las httpErrors además de la norma customErros config:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="403" subStatusCode="-1" /> 
     <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" /> 
    </httpErrors> 
    </system.webServer> 

y eliminar esta línea de aquí para allá m Global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute()); 

No es sin embargo tan perfecta que estoy tratando de recuperar el último error que siempre es nula.

Server.GetLastError() 

Ver https://stackoverflow.com/a/7499406/1048369 para la pieza más completa de errores personalizados en MVC3 he encontrado que era de gran ayuda.

+1

Me gustaría repetir esto: Server.GetLastError parece ser irrecuperable :( –

0

Tengo el mismo problema, que capta la excepción directamente en Global.asax en ese caso:

protected void Application_Error(object sender, EventArgs e) 
     { 
      Exception exception = Server.GetLastError(); 

      Response.Clear(); 



      HttpException httpException = exception as HttpException; 

      var code = httpException == null ? 500 : httpException.GetHttpCode(); 

      // Log the exception. 
      if (code == 500) 
       logError.Error(exception); 

      Server.ClearError(); 

      Context.Items["error"] = code; 

      RouteData routeData = new RouteData(); 
      routeData.Values.Add("controller", "Error"); 
      routeData.Values.Add("action", "Index"); 
      routeData.Values.Add("code", code); 

      IController errorController = new ErrorController(); 
      errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 

     } 

que redirige a mi costumbre de error 500:?/Error/código Índice = 500

+0

No puedo aceptar esto como la respuesta, ya que lo tengo funcionando sin usar el método Application_Error y usando la sección de configuración httpErrors en su lugar. ¡Daría tu respuesta a +1 pero todavía no tengo suficientes representantes! ¡Saludos, aunque! – Nick

+0

Por supuesto que no hay ninguna razón por la que los httpErrors no funcionen (configuración fina), la solución que uso me da más control sobre las excepciones no detectadas – fmgp

+0

No es válida la lógica al afirmar que si httpException es nulo, debe suponerse que es un error 500. Un error 500 debe ser confirmado por los datos pasados ​​por la excepción. –

Cuestiones relacionadas