当调用是异步的时,我在经典ASP下使用MsXml.ServerXmlHttp对象从JScript中得到一个错误。错误消息是“找不到窗口类”。
环境是: Windows 2003 SP2;IIS v6;经典ASP;JScript
当调用ServerXmlHttp.open = true时,发送方法上会发生错误。当使用异步= false调用ServerXmlHttp.open时,错误不会发生
该代码工作在一个测试环境上,该环境具有所有主要产品的所有相同版本(尽管它与生产环境并不相同)。
在测试环境中,代码同时适用于同步打开和异步打开。
使用MSXML2.ServerXMLHTTP.6.0 MSXML2.ServerXMLHTTP.4.0 MSXML2.ServerXMLHTTP.2.0时发生错误
代码以同样的方式失败,而不考虑URL: google.com和stackoverflow.com失败,就像我需要调用的实际页面一样
在测试环境google.com、stackoverflow.com和页面中,我需要调用所有工作。
无论我使用GET还是POST,都会发生错误。
无论标头如何,都会发生错误。
无论协议是HTTP还是HTTPS,都会发生错误。
错误发生得非常快--几乎肯定是客户端。
当连接是同步的时,不会发生错误。
我已经重新安装了MSXML6.msi
我使用"proxycfg.exe -d“来配置internet堆栈,使其不使用代理。(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、滚动条等)。
这篇知识库文章(http://support.microsoft.com/kb/303326)包含以下异步特定说明:
ServerXMLHTTP不使用Urlmon.dll。但是,当您在异步模式下使用ServerXMLHTTP时,您也需要这个消息泵,因为解析器通过将消息回发到线程来触发事件。
Urlmon.dll确实存在于服务器的system32文件夹中。但是,它并不存在于代码以异步模式工作的测试服务器上:S (我没有显式地安装urlmon.dll --当我去寻找它时它就在那里)。
我的猜测是,服务器上存在一些配置或安装问题。也许是缺少了MSXML的缺陷。但我不知道如何进一步调查。有人有什么建议吗?
尤其是,有人能告诉我:
谢谢你读了这么多。
发布于 2009-06-16 20:28:22
带有COM对象的ASP的单线程特性将不允许您像您想象的那样处理异步事件。
人们可能会认为,通过引用在global.asa中声明的事件处理程序,这是可能的,但我怀疑这是否有效。
您的代码完全没有意义,因为您试图完全复制async=false所做的工作。可以使用setTimeout()方法控制超时。
https://stackoverflow.com/questions/725178
复制相似问题