2011-12-01 9 views
6

tengo que tirar HttpException durante AjaxRequest en Controller y CustomFilterAttributeCómo tirar código de estado HTTP personalizado durante el Ajax petición (Post)

Cuando lanzo Exception en Controller con 403 error

[HttpPost] 
[CustomAuthorize] 
public ActionResult AjaxSelectBinding() 
{ 
    // 403 Error code 
    throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden"); 
} 

En el script de cliente I obtener siempre el código de resultado - 500

$.ajax({ 
      type: 'POST', 
      url: '/Groups/AjaxSelectBinding', 
      success: function(data) { 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       // HERE I GET ALWAYS 500 ERROR CODE 
      } 
     }); 

¿Cómo puedo lanzar HttpException en mi FilterAttribute y obtener este código en la página del cliente. Trato de hacer esto, pero me da 200 código de estado:

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     SharedControllerBase ctrl = (SharedControllerBase)filterContext.Controller; 

     if (!ctrl.User.Identity.IsAuthenticated && 
      filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
     } 
    } 

Cuando intento lanzar Exception en FilterAttribute me sale 500 Código de estado de nuevo

Respuesta

6

Lo primero es lo primero HttpStatusCode.Unauthorized = 401, no código de estado 403. Hay una distinción importante entre esos 2 códigos.

Cuando se establece el código de estado 401 a algunos desagradables cosas: que automáticamente redirigido a la página de entrada por el módulo de autenticación de formularios de ASP.NET => la página de acceso se sirve con código de estado = 200. Phil Haack abordado este problema en el following blog post.

Por lo que respecta a throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden"); en su acción de controlador, bien, lanza una excepción que es de tipo HttpException y cuyo código de estado se establece en 401 pero aparte de eso no hay absolutamente nada que capte esta excepción y configure el correspondiente código de estado de respuesta. Por lo tanto, la excepción surge y, dado que presumiblemente no tiene un controlador de excepción global, el servidor lo traduce como una página de error de 500.

Aquí hay un ejemplo de global exception handler que puede serle útil.

+0

Thx. No quiero redirigir el error 'HttpStatusCode.Unauthorized', porque en el cliente, en este caso, obtengo la página de inicio de sesión y el resultado de 200 (éxito). Quiero traducir mis códigos personalizados en error ajax function-callback, pero el servidor web siempre me notifica como 500 código de estado. En el controlador puedo capturar 2 excepciones (acceso y error interno) y en el código del cliente, necesito traducirlo. – Kronos

Cuestiones relacionadas