如何在Application_Error()中知道asp.net中的请求是ajax

时间:2011-09-26 06:40:05

标签: c# asp.net asp.net-mvc web-applications application-error

如何在Application_Error()

中知道asp.net中的请求是ajax

我想在Application_Error()中处理app错误。如果请求是ajax并且抛出了一些异常,则在日志文件中写入错误并返回包含客户端错误提示的json数据。 否则,如果请求是同步的并且抛出了一些异常,请在日志文件中写入错误,然后重定向到错误页面。

但现在我无法判断请求是哪种。我想得到" X-Requested-With"从标题,不幸的是标题的键不包含" X-Requested-With"关键,为什么?

3 个答案:

答案 0 :(得分:21)

测试请求标头应该有效。例如:

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

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

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

}

然后发送一些Ajax请求:

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

答案 1 :(得分:4)

您还可以在包含方法IsAjaxRequest的HttpRequestWrapper中包装Context.Request(类型为HttpRequest)。

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

答案 2 :(得分:0)

可以在客户端ajax调用中添加自定义标头。请参阅http://forums.asp.net/t/1229399.aspx/1

尝试在服务器中查找此标头值。