使用ServerXMLHTTP对象发送HTTPS“GET”请求时,我遇到了一个涉及“超时”的问题。
为了欺骗对象使用登录用户的id和密码发送请求,我将其设置为使用虚拟代理,然后排除URL的域(在Intranet上)。所以变量url_to_get包含.mydomain.com,而代理地址实际上是“not.used.com”。
// JScript source code
HTTP_RequestObject = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
// Using logged in username authentication
HTTP_RequestObject.open("GET", url_to_get, false);
HTTP_RequestObject.setProxy(2, "not.used.com", "*.mydomain.com");
try
{
HTTP_RequestObject.send();
}
catch (e)
{
}
在catch块中,我记录了一个“(0x80072EE2)操作超时”的异常。在打开之前的日志消息之后,这是1到2秒的时间戳。
重试将按预期工作,并且可以一遍又一遍地执行。这是服务器端的东西吗?或者它是代理的结果?
答案 0 :(得分:0)
这真是痛苦和尴尬。我找出了我在超时时遇到的问题的根本原因。我将超时设置为“默认值”,比实际默认值小3个数量级。因此,即使我将它们增加到我认为非常大的值,我仍然比默认值短。
我浏览了Microsoft page describing the setTimouts() method上的措辞并错误解释了参数的时基。我假设秒数,实际上是几毫秒。
在调试此问题的过程中,我使用备用COM对象“WinHttp.WinHttpRequest.5.1”复制了代码,并在验证等效API SetTimeouts()时发现了失败的pas。
我确实在这个过程中学到了一些东西,所以一切都没有丢失,“WinHttp.WinHttpRequest.5.1”有一个SetAutoLogonPolicy()[3]方法,它允许我跳过“Msxml2”所需的“代理”愚蠢.ServerXMLHTTP.6.0“强制它将用户的凭据发送到Intranet服务器。我也摆弄了Fiddler [4]并学到了足够的危险!
希望其他人可以从我的错误中吸取教训,并在将来调试自己的问题时发现这很有用。
以下是一些内联链接,因为我没有足够的代表来发布两个以上的内容:
[3]:msdn.microsoft.com/en-us/library/windows/desktop/aa384050%28v=vs.85%29.aspx
[4]:fiddler2.com
答案 1 :(得分:0)
Msxml2.ServerXMLHTTP.6.0
可以通过代理使用。我花了一段时间,但坚持不懈。我根据微软的建议从WinHttp.WinHttpRequest.5.1
移到Msxml2.ServerXMLHTTP.6.0
。
如果varHTTP是Msxml2.ServerXMLHTTP.6.0
的对象引用,则可以使用
varHTTP.setproxy 2, ProxyServerName, "BypassList"
希望这会有所帮助,您可以通过Msxml2.ServerXMLHTTP.6.0
继续追求。