Firefox 将一个 ajax 调用变成三个 http-requests,如何在没有适当 windows 授权的情况下避免这两个调用

Firefox turning one ajax call into three http-requests, how to avoid the two calls without proper windows authorization

我设法在 ASP 页面中创建了一个 ajax 调用,但是使用 Fiddler 我发现实际上总是有 3 个调用,身份验证越来越多,浪费了网络传输时间和带宽。

第一个调用没有授权 header,服务器响应一个 6 KB 的页面说 HTTP 401.2 Unauthorized,其中包含关于最可能的原因和您可以尝试的用户友好信息。

然后发送第二个请求,带有额外的 header 比如:

Authorization: NTLM ....(56 bytes base64)...

现在服务器响应一个简单的 341 字节 html 消息只是说:

Not Authorized
HTTP Error 401. The requested resource requires user authentication.

然后发送第三个请求,带有更长的 Auth header,例如:

Authorization: NTLM ....(688 bytes base64)...

现在响应来自 code-behind,带有我自己的 14 字节 JSON 消息。

对我来说,前两个消息交换似乎很浪费。如何让 ajax 调用始终发送完整授权 header 以避免前两个大约 6500 字节的响应,并只获得我自己的 14 字节有用响应?

我尝试添加 xhrFields.withCredentials = true 设置,但在使用和不使用此设置时都会看到上述行为。

这是 ajax 调用:

        $.ajax({
            type: "POST",
            url: "Timeout_Test.aspx/GetAjax",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            xhrFields: {
                withCredentials: true
            },
            success: function (data, textStatus, jqXHR) {...},
            error: function (jqXHR, textStatus, errorThrown) {...}
        });

我尝试避免 session 超时的 javascript asp 调用也会发生同样的情况:

    function get_asp() {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function () {...}
        xmlHttp.withCredentials = true;
        xmlHttp.open("GET", "Timeout_Test.aspx?type=keepalive", true); // true for asynchronous 
        xmlHttp.send(null);
    }

web.config 包含:

<authentication mode="Windows"/>

要访问该页面,我必须输入一次 windows 登录名和密码。该页面包含一个按钮和一些带有间隔计时器的 javascript 逻辑,每分钟左右完成一次 ajax 调用。它实际上打败了我 javascript 如何知道登录凭据,但 ajax 调用工作得很好。两个中间 401 错误消息隐藏在 javascript 代码中,除了在 Fiddler http 侦听工具中可见外,不会在任何地方显示。

firebug 调试 session 只显示一个成功的 ajax 调用,而 Fiddler 清楚地显示 3 个 http 请求和 2 个错误响应 401。我在我的页面上制作时间戳输出,并且非常确定我每分钟只打一个 ajax 电话。 3次反应很快,总共1秒左右。

不,总计 35 毫秒。请求 1 在 T.471,响应 1 在 T.473,然后 Req2 在 T.487,Resp2 在 T.489,最后 Req3 在 T.502,Resp3 在 T.505,其中 T 是 18:22:12 的时间.根据 Fiddler Statistics 窗格。

使用 Visual Studio 2015 C# 调试器我发现对于每个 ajax 调用,后面的代码只被调用一次。因此,具有 401 错误响应的前两个请求没有到达 code-behind,仅到达 Web 服务器。

我必须猜测 Firefox 浏览器正在解释和 运行 javascript 代码与 ajax 调用,正在执行三个 http 请求,并逐渐获得更多授权 "automatically"。

问题是:如何对 ajax 调用进行编程,以便 Firefox 仅执行 http-request 的第三个版本,而无需经历前两个不成功的 http-request?

好的,这种奇怪的行为似乎来自发出的两个请求之间的交互 ​​"at the same time"。我已经展示了 ajax 调用和 asp 调用的代码。这是一个测试页面,用于查看 session 是否以及如何通过 ajax and/or asp 调用超时。当这两个靠近时,就会看到三元组 http-request。

在更正常的情况下,我们有一个 ajax 调用,或者一个 asp 调用,只有一个 http 请求,完全没有授权 header。

在这种情况下,第一个 http-request 成功了,这似乎是网络服务器的问题,即 IIS,而不是浏览器 (Firefox)。另一方面,由于 Firefox 可以通过发送额外的 header 从 401 中恢复,这可能是标准的 http 协议,而不是 "bug".

我可以忍受这种情况,因为在正常操作中我可以避免同时拨打两个电话。