2011-02-03 10 views
5

He luchado un par de días con el manejo de errores en MVC. Todavía no lo tengo bien. (También he leído la mayoría de las preguntas aquí en SO y en Google hasta que mis dedos sangraron)Error al manejar en MVC

Lo que quiero hacer:

  1. uso del estándar [Authorize] atributo
  2. Redirección de todos los errores de mi error Controlador (incluido el no autorizado)
  3. Tiene una acción por error HTTP en mi controlador de errores.

Lo que no quiero hacer:

  1. Coloque el [ErrorHandler] en todos mis controladores (que puede ser usado en mi controlador de base)?
  2. Utilice un atributo Autorizar personalizado.

En realidad, podría hacer cualquier cosa que sea necesaria (incluida la lista NOT) mientras tenga el # 1-3 en funcionamiento.

Lo que he intentado:

  1. Usando Application_Error
  2. Usando Controller.HandleUnknownAction
  3. Usando Controller.OnException
  4. Usando [ErrorHandler] en mis controladores
  5. Encendido/apagado de CustomErrors en web.config

Supongo que necesito una combinación de esos o tal vez algo más?

Respuesta

2

Puede usar un filtro personalizado, simplemente extienda ErrorHandlerAttribute y tenga en cuenta su controlador de errores. Que añadirlo como un filtro global dentro Application_Start:

GlobalFilters.Filters.Add(new CustomAErrorHandlerAttribute()); 
4

También podría manejar toda su lógica de error en el Application_Error de su Global.asax.cs y luego encaminarlos fundamenta de forma dinámica en los diferentes códigos de estado HTTP:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError().GetBaseException(); 

    var routeData = new RouteData(); 

    if (ex.GetType() == typeof(HttpException)) 
    { 
     var httpException = (HttpException)ex; 

     switch (httpException.GetHttpCode()) 
     { 
      case 401: 
       routeData.Values.Add("action", "NotAuthorized"); 
       break; 
      case 403: 
       routeData.Values.Add("action", "NotAuthorized"); 
       break; 
      case 404: 
       routeData.Values.Add("action", "PageNotFound"); 
       break; 
      default: 
       routeData.Values.Add("action", "GeneralError"); 
       break; 
     } 
    } 
    else 
    { 
     routeData.Values.Add("action", "GeneralError"); 
    } 

    routeData.Values.Add("controller", "Error"); 
    routeData.Values.Add("error", ex); 

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

parece que la 401 no lanza necesaria una HttpException por lo que desea manejar eso manualmente para adaptarse a la lógica:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Context.Response.StatusCode == 401) 
    { 
     throw new HttpException(401, "You are not authorised"); 
    } 
} 

Y sí, sus controladores heredan los atributos de su conroller base.

+0

intentado. No se llama a 401. No tengo idea de por qué. – jgauffin

+0

No lo he intentado con un 401, pero de acuerdo con esta respuesta (http://stackoverflow.com/questions/1679881/asp-net-mvc-user-friendly-401-error) debería arrojar una 'HttpException' como bien. –

+0

Ah, podría ser que necesites comprobar 'Context.Response.StatusCode == 401' en tu' Application_EndRequest() 'y luego lanzar' HttpException (401, "No estás autorizado") 'por ti mismo. –

Cuestiones relacionadas