2011-09-26 9 views
11

Come sapere se la richiesta è Ajax in asp.net in Application_Error()Come sapere se la richiesta è Ajax in asp.net in Application_Error()

voglio gestire l'errore applicazione in Application_Error(). Se la richiesta è ajax e viene generata qualche eccezione, quindi scrivere l'errore nel file di registro e restituire un dato json che contiene i suggerimenti di errore per il client. Altrimenti se la richiesta è sincronizzata e viene generata qualche eccezione, scrivere l'errore nel file di registro e quindi reindirizzare a una pagina di errore.

ma ora non posso giudicare quale tipo è la richiesta. Voglio ottenere "X-Requested-With" dall'intestazione, sfortunatamente le chiavi delle intestazioni non contengono la chiave "X-Requested-With", perché?

risposta

20

Il test per l'intestazione della richiesta dovrebbe funzionare. Per esempio:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult AjaxTest() 
    { 
     throw new Exception(); 
    } 
} 

e in Application_Error:

protected void Application_Error() 
{ 
    bool isAjaxCall = string.Equals("XMLHttpRequest", Context.Request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase); 
    Context.ClearError(); 
    if (isAjaxCall) 
    { 
     Context.Response.ContentType = "application/json"; 
     Context.Response.StatusCode = 200; 
     Context.Response.Write(
      new JavaScriptSerializer().Serialize(
       new { error = "some nasty error occured" } 
      ) 
     ); 
    } 

} 

e poi inviare qualche richiesta Ajax:

<script type="text/javascript"> 
    $.get('@Url.Action("AjaxTest", "Home")', function (result) { 
     if (result.error) { 
      alert(result.error); 
     } 
    }); 
</script> 
+0

Sei sicuro che Context.Request.Headers ["x-requested-with"] restituirà "XMLHttpRequest". Invio una richiesta Ajax sopra il codice restituito null. – dayulu

+1

@dayulu, assolutamente, il codice che ho mostrato è stato testato. Potrebbe esserci un altro problema con il codice: se si dispone di un filtro globale personalizzato che intercetta le eccezioni ed esegue un reindirizzamento a una pagina di errore, l'intestazione x-requested-con verrà persa. –

+0

Hai ragione! Ottengo null, perché la richiesta reindirizza una volta! Grazie mille! – dayulu

0

È possibile utilizzare questo.

private static bool IsAjaxRequest() 
    { 
     return HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest"; 
    } 
4

Si può anche avvolgere il Context.Request (del tipo HttpRequest) in una HttpRequestWrapper quali contiene un metodo IsAjaxRequest.

bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest(); 
Problemi correlati