2011-12-01 6 views
6

ho bisogno di buttare HttpException durante AjaxRequest in Controller e CustomFilterAttributeCome buttare codice di stato personalizzato http durante Ajax richiesta (Post)

Quando butto Exception in Controller con 403 errore

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

nello script client I ottenere sempre il codice del risultato - 500

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

Come posso lanciare HttpException nel mio FilterAttribute e ottenere questo codice nella pagina client. Provo fare questo, ma ho 200 codice di stato:

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; 
     } 
    } 

Quando provo gettare Exception in FilterAttribute ottengo 500 Codice di stato di nuovo

risposta

6

Per prima cosa HttpStatusCode.Unauthorized = 401, non 403 codice di stato. C'è un'importante distinzione tra questi 2 codici.

Quando si imposta il codice di stato 401 per alcuni brutte cose accadono: automaticamente reindirizzato alla pagina di accesso da parte del ASP.NET Forms modulo di autenticazione => la pagina di login viene servito con codice di stato = 200. Phil Haack affrontato questo problema nel following blog post.

Per quanto riguarda l'azione del controller, beh, si genera un'eccezione di tipo HttpException e il cui StatusCode è impostato su 401 ma a parte questo non c'è assolutamente nulla che catturerà questa eccezione e imposterà il corrispondente codice di stato della risposta. Quindi l'eccezione bolle e poiché non si dispone presumibilmente di un gestore di eccezioni globale, viene tradotto come una pagina di errore 500 dal server.

Ecco un esempio di global exception handler che potresti trovare utile.

+0

Thx. Non desidero reindirizzare l'errore 'HttpStatusCode.Unauthorized', perché nel client in questo caso ottengo la pagina di accesso e 200 (esito positivo). Voglio tradurre i miei codici personalizzati in errore ajax function-callback, ma il web server mi notifica sempre come 500 codice di stato. Nel controller posso rilevare 2 eccezioni (accesso e errore interno) e nel codice client ho bisogno di tradurlo. – Kronos