How to know if the request is ajax in asp.net in Application_Error()
How to know if the request is ajax in asp.net in Application_Error()
I want to handle app error in Application_Error().If the request is ajax and some exception is thrown,then write the error in log file and return a json data that contains error tips for client . Else if the request is synchronism and some exception is thrown ,write the error in log file and then redirect to a error page.
but now i cant judge which kind the reque开发者_高级运维st is . I want to get "X-Requested-With" from header ,unfortunately keys of headers don't contain "X-Requested-With" key ,why?
Testing for the request header should work. For example:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult AjaxTest()
{
throw new Exception();
}
}
and 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" }
)
);
}
}
and then send some Ajax request:
<script type="text/javascript">
$.get('@Url.Action("AjaxTest", "Home")', function (result) {
if (result.error) {
alert(result.error);
}
});
</script>
You can also wrap the Context.Request (of the type HttpRequest) in a HttpRequestWrapper which contains a method IsAjaxRequest.
bool isAjaxCall = new HttpRequestWrapper(Context.Request).IsAjaxRequest();
it is possible to add custom headers in the client side ajax call. Refer http://forums.asp.net/t/1229399.aspx/1
Try looking for this header value in the server.
You could use this.
private static bool IsAjaxRequest()
{
return HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
}
精彩评论