2011-09-26 9 views
11

¿Cómo saber si la solicitud es ajax en asp.net en Application_Error()¿Cómo saber si la solicitud es ajax en asp.net en Application_Error()

quiero manejar errores en la aplicación Application_Error(). Si la solicitud es ajax y se lanza alguna excepción, escriba el error en el archivo de registro y devuelva una información json que contenga sugerencias de error para el cliente. De lo contrario, si la solicitud es de sincronización y se lanza alguna excepción, escriba el error en el archivo de registro y luego redirija a una página de error.

pero ahora no puedo juzgar de qué tipo es la solicitud. Quiero obtener "X-Solicitado-Con" desde el encabezado, lamentablemente las teclas de los encabezados no contienen la tecla "X-Solicitado-Con", ¿por qué?

Respuesta

20

Las pruebas para el encabezado de solicitud deberían funcionar. Por ejemplo:

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

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

y en 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" } 
      ) 
     ); 
    } 

} 

y luego enviar alguna petición Ajax:

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

¿Estás seguro de que Context.Request.Headers ["x-requested-with"] devolverá "XMLHttpRequest". Envío una solicitud ajax por encima del código return null. – dayulu

+1

@dayulu, absolutamente, el código que le he mostrado ha sido probado. Puede haber otro problema con su código: si tiene algún filtro global personalizado que intercepta excepciones y realiza un redireccionamiento a una página de error, se perderá el encabezado x-requested-with. –

+0

¡Tienes razón! Me sale nulo, porque la solicitud redirige una vez! ¡Muchas gracias! – dayulu

0

Usted podría utilizar esto.

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

También puede envolver el Context.Request (del tipo HttpRequest) en un HttpRequestWrapper cuales contiene un IsAjaxRequest método.

bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest(); 
Cuestiones relacionadas