Javascript Firefox将一个ajax调用转换为三个http请求,如何在没有适当windows授权的情况下避免这两个调用

Javascript Firefox将一个ajax调用转换为三个http请求,如何在没有适当windows授权的情况下避免这两个调用,javascript,asp.net,ajax,windows-authentication,Javascript,Asp.net,Ajax,Windows Authentication,我设法在ASP页面中创建了一个ajax调用,但使用Fiddler,我发现实际上总是有3个调用,认证越来越多,浪费了网络传输时间和带宽 第一个调用没有授权头,服务器响应时会显示一个6KB的页面,显示http401.2unauthorized,其中包含用户友好的信息,包括最可能的原因以及您可以尝试的内容 然后发送第二个请求,其中包含一个额外的头,如: Authorization: NTLM ....(56 bytes base64)... Authorization: NTLM ....(688

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

第一个调用没有授权头,服务器响应时会显示一个6KB的页面,显示
http401.2unauthorized
,其中包含用户友好的信息,包括最可能的原因以及您可以尝试的内容

然后发送第二个请求,其中包含一个额外的头,如:

Authorization: NTLM ....(56 bytes base64)...
Authorization: NTLM ....(688 bytes base64)...
现在,服务器响应一条简单的341字节html消息,只是说:

Not Authorized
HTTP Error 401. The requested resource requires user authentication.
然后发送第三个请求,其中包含更长的Auth头,如:

Authorization: NTLM ....(56 bytes base64)...
Authorization: NTLM ....(688 bytes base64)...
现在,响应来自后面的代码,带有我自己的14字节JSON消息

在我看来,前两次信息交流似乎是浪费。如何让ajax调用始终发送完整的授权头,以避免前两个大约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) {...}
        });
在我尝试避免会话超时的实验中,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调试会话只显示了一个成功的ajax调用,而Fiddler用401清楚地显示了3个http请求和2个错误响应。我在我的页面上进行时间戳输出,并且非常确定我每分钟只进行一次ajax调用。这三种反应都很快,总共约1秒

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

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

我必须猜测,Firefox浏览器,即通过ajax调用解释和运行javascript代码的浏览器,正在“自动”执行三个http请求,并逐渐获得更多授权


问题是:如何对ajax调用进行编程,使Firefox只执行第三个版本的http请求,而不执行前两个不成功的http请求?

好的,这种奇怪的行为似乎来自“同时”发出的两个请求之间的交互。我已经展示了ajax调用和asp调用的代码。这是一个测试页面,用于查看会话是否以及如何通过ajax和/或asp调用超时。当这两者紧密结合时,就会看到三重http请求

在更普通的情况下,我们有ajax调用或asp调用,只有一个http请求,完全没有授权头

在这种情况下,第一个http请求成功,这似乎是web服务器(即IIS)的问题,而不是浏览器(Firefox)的问题。另一方面,由于Firefox可以通过发送额外的头从401恢复,这可能是一个标准http协议,而不是一个“bug”


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

始终是3个电话
3个电话是来自浏览器的3个请求?java脚本和ajax对于每个请求只有一个调用,所以如果您没有请求它,那么就不会进行另一个调用。我认为还需要更多的信息。@Seabizkit显示的代码只调用了一次,但导致了三个请求。这仅在使用fiddler时可见。代码成功,只返回代码后面的最终响应,并隐藏了402条错误消息。不,罗兰,我99%确信这是不可能的<代码>$.ajax({是一个调用,您的问题必须来自其他源…从
超时测试返回的内容。aspx/GetAjax
完整响应是我感兴趣的,不仅仅是标题和内容。我猜是
超时测试。aspx/GetAjax
是其他调用的来源…嵌入到框架中。@Seabizkit感谢您的c注意。我刚刚达到你留给我的1%:-)