ServerXMLHTTP错误:找不到窗口类

时间:2009-04-07 11:22:01

标签: javascript windows http serverxmlhttp

当调用异步时,我在经典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调用的设置或配置?

感谢您阅读此内容。

1 个答案:

答案 0 :(得分:0)

使用COM对象的ASP的单线程特性不允许您像处理的那样处理异步事件。

有人可能会认为这可以通过引用global.asa中声明的事件处理程序来实现,但我怀疑它是否会起作用。

您的代码完全没有意义,因为您试图完全复制async=false的内容。您可以使用setTimeout()方法控制超时。