Ошибка ServerXMLHTTP: не удается найти класс окна

Я получаю сообщение об ошибке, используя объект MsXml.ServerXmlHttp из JScript в классическом ASP, когда вызов является асинхронным. Сообщение об ошибке: «не удается найти класс окна».


Среда: Windows Server 2003 SP2; ИИС версии 6; Классический АСП; JScript

Когда ServerXmlHttp.open вызывается с asynch = true, возникает ошибка в методе отправки. Когда ServerXmlHttp.open вызывается с asynch = false, ошибка не возникает

Код работает в тестовой среде, в которой есть все те же версии основных продуктов (хотя он не идентичен производственной среде).

В тестовой среде код работает как с синхронным, так и с асинхронным открытым

Ошибка возникает при использовании 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», чтобы настроить интернет-стек, чтобы НЕ использовать прокси. (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)

Приложение пыталось использовать класс окна, который не был классом приложения, зарегистрированным в системе, или одним из предопределенных классов управления (например, BUTTON, LISTBOX, SCROLLBAR и т. д.).

Эта статья базы знаний (http://support.microsoft.com/kb/303326) содержит следующее асинхронное примечание:

ServerXMLHTTP не использует Urlmon.dll. Однако, когда вы используете ServerXMLHTTP в асинхронном режиме, вам также нужна эта перекачка сообщений, поскольку синтаксический анализатор инициирует событие, отправляя сообщения обратно в поток.

Urlmon.dll существует в папке system32 сервера. Однако его нет на тестовом сервере, где код работает в асинхронном режиме :S. (Я не устанавливал явно urlmon.dll — он просто был там, когда я пошел его искать.)

Я предполагаю, что на сервере есть какая-то проблема с конфигурацией или установкой. Возможно, отсутствует зависимость MSXML. Но я не знаю, как исследовать дальше. У кого-нибудь есть предложения?

В частности, может ли кто-нибудь сказать мне:

  • Каковы зависимости MsXml.ServerXmlHttp?

    или как я могу понять их.

  • Что означает сообщение об ошибке «не удается найти класс окна» в этом контексте?

  • Существуют ли какие-либо параметры или конфигурации, относящиеся к асинхронным HTTP-вызовам?

Спасибо, что дочитали до этого места.


person Community    schedule 07.04.2009    source источник
comment
что за перекати-поле ... я думаю, написание длинного вопроса, такого как этот, - это один из способов получить этот значок;)   -  person Peter Perháč    schedule 26.05.2009


Ответы (1)


Однопоточная природа ASP с COM-объектами не позволит вам обрабатывать асинхронные события, как вы могли бы подумать.

Можно подумать, что это возможно, если обратиться к обработчику событий, объявленному в global.asa, но я сомневаюсь, что это сработает.

Ваш код совершенно бессмысленен, поскольку вы пытаетесь точно воспроизвести то, что делает async=false. Вы можете управлять тайм-аутом, используя метод setTimeout().

person Thomas Kjørnes    schedule 16.06.2009