XMLHttpRequest() 未被识别为 IsAjaxRequest?

XMLHttpRequest() not recognized as a IsAjaxRequest?

为了在 Ajax 请求会话超时时将用户重定向到登录页面,我实现了以下自定义属性,

Unauthorize请求相关代码如下,

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = 403;
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "SessionTimeOut"
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                filterContext.HttpContext.Response.End();
            }
....................

这适用于 ajax 个请求($.ajax)。

但是 filterContext.HttpContext.Request.IsAjaxRequest() 无法将 XMLHttp 请求识别为 ajax 请求。

var xhr = new XMLHttpRequest();
                xhr.open('POST', "...URL");
                xhr.send(formdata);

有没有人遇到过类似的问题?有什么解决方案?

这是 ASP.NET MVC 5

IsAjaxRequest() 的代码
public static bool IsAjaxRequest(this HttpRequestBase request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    return request["X-Requested-With"] == "XMLHttpRequest" || (request.Headers != null && request.Headers["X-Requested-With"] == "XMLHttpRequest");
}

看起来请求中存在对某个 header 值 (X-Requested-With) 的依赖,以便该函数 return 为真。

这里有一些关于 X-Requested-With

的更多信息

What's the point of the X-Requested-With header?

您总是可以查看 jQuery $.ajax() 代码本身,了解它是如何设置 header 的。老实说,如果没有 jQuery,我不会费心去做 ajax,反正它会为你处理所有这些事情。