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".
我可以忍受这种情况,因为在正常操作中我可以避免同时拨打两个电话。
我设法在 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".
我可以忍受这种情况,因为在正常操作中我可以避免同时拨打两个电话。