当调用异步时,我在经典ASP下使用JScript中的MsXml.ServerXmlHttp对象时收到错误。错误消息是“找不到窗口类”
环境是:Windows Server 2003 SP2; IIS v6;经典ASP; JScript的
当使用asynch = true调用ServerXmlHttp.open时,send方法会发生错误。 当使用asynch = false调用ServerXmlHttp.open时,不会发生错误
代码适用于测试环境,该环境具有所有相同版本的主要产品(尽管它与生产环境不同)
在测试环境中,代码同时使用同步和异步打开
使用时发生错误 MSXML2.ServerXMLHTTP.6.0 MSXML2.ServerXMLHTTP.4.0 MSXML2.ServerXMLHTTP.2.0
无论网址如何,代码都以相同的方式失败:google.com和stackoverflow.com失败就像我需要调用的实际页面一样
在测试环境google.com,stackoverflow.com以及我需要调用所有工作的页面。
无论我使用GET还是POST
,都会发生错误无论标题如何,都会发生错误。
无论协议是HTTP还是HTTPS,都会发生错误。
错误发生得非常快 - 几乎肯定是客户端。
连接同步时不会发生错误。
我重新安装了MSXML6.msi
我使用“proxycfg.exe -d”来配置互联网堆栈不使用代理。 (http://support.microsoft.com/kb/289481/)
这是一个指示性的代码示例(我简化了它,因为我不认为代码是问题):
var xmlServerHttp = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0");
xmlServerHttp.open("POST", "http://some-url.com", true); //true causes error
xmlServerHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlServerHttp.send("some=values&some=othervalues"); //error happens here
var responseXML;
var stateok = false;
var numOfWaits = 10;
do {
if (xmlServerHttp.readyState == READYSTATE_COMPLETED) {
responseXML = String(xmlServerHttp.responseText);
stateok = true;
}
else {
xmlServerHttp.waitForResponse(1);
}
} while (!stateok && --numOfWaits > 0);
此代码在xmlServerHttp.send调用上抛出错误:“找不到窗口类”。
这就是MSDN对错误(http://msdn.microsoft.com/en-us/library/ms820745.aspx)
所说的内容应用程序试图使用窗口 那个不是的班级 特定于应用程序的类已注册 与系统或其中之一 预定义的控件类(例如 按钮,LISTBOX,SCROLLBAR等 上)。
此知识库文章(http://support.microsoft.com/kb/303326)包含以下异步特定说明:
ServerXMLHTTP不使用Urlmon.dll。 但是,当您使用ServerXMLHTTP时 异步模式,你也需要这个 消息泵,因为解析器触发 通过发回消息的事件 线程。
Urlmon.dll确实存在于服务器的system32文件夹中。但是,在代码以异步模式工作的测试服务器上不存在:S。 (我没有明确安装urlmon.dll - 当我去寻找它时它就在那里。)
我的猜测是服务器上存在一些配置或安装问题。可能缺少MSXML依赖性。但我不知道如何进一步调查。有没有人有任何建议?
特别是,任何人都可以告诉我:
MsXml.ServerXmlHttp的依赖关系是什么?
或我如何解决它们。
在此上下文中,“无法找到窗口类”的错误消息是什么意思?
是否有任何特定于异步HTTP调用的设置或配置?
感谢您阅读此内容。
答案 0 :(得分:0)
使用COM对象的ASP的单线程特性不允许您像处理的那样处理异步事件。
有人可能会认为这可以通过引用global.asa
中声明的事件处理程序来实现,但我怀疑它是否会起作用。
您的代码完全没有意义,因为您试图完全复制async=false
的内容。您可以使用setTimeout()
方法控制超时。