C# 如何知道asp.net中的应用程序_Error()中的请求是否为ajax

C# 如何知道asp.net中的应用程序_Error()中的请求是否为ajax,c#,asp.net,asp.net-mvc,web-applications,application-error,C#,Asp.net,Asp.net Mvc,Web Applications,Application Error,如何知道asp.net中的应用程序_Error()中的请求是否为ajax 我想在Application_error()中处理app error。如果请求是ajax并且引发了一些异常,那么将错误写入日志文件并返回一个json数据,其中包含客户端的错误提示。 否则,如果请求是同步的,并且引发了一些异常,请将错误写入日志文件,然后重定向到错误页面 但是现在我无法判断这个请求是哪一种。我想从header中获取“X-request-With”,不幸的是,header的键不包含“X-request-With

如何知道asp.net中的应用程序_Error()中的请求是否为ajax

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


但是现在我无法判断这个请求是哪一种。我想从header中获取“X-request-With”,不幸的是,header的键不包含“X-request-With”键,为什么?

可以在客户端ajax调用中添加自定义头。提及


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

测试请求标头应该可以工作。例如:

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

    public ActionResult AjaxTest()
    {
        throw new Exception();
    }
}
应用程序错误中

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>

$.get('@Url.Action(“AjaxTest”,“Home”)',函数(结果){
if(result.error){
警报(结果错误);
}
});
您可以使用这个

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

您还可以将Context.Request(HttpRequest类型)包装在HttpRequestWrapper中,HttpRequestWrapper包含一个方法IsAjaxRequest

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

您确定Context.Request.Headers[“x-Request-with”]将返回“XMLHttpRequest”吗。我发送了一个ajax请求,上面的代码返回null。@dayulu,绝对是这样,我向您展示的代码已经过测试。您的代码可能还有另一个问题:如果您有一些自定义全局筛选器,可以拦截异常并执行重定向到错误页,那么x-requested-with标头将丢失。您是对的!我得到null,因为请求重定向一次!非常感谢你!这在global.asax中不起作用。改用
\u CALLBACKID
。希望这有帮助。