ServerXMLHTTP Ошибка: не удается найти класс окна - PullRequest
0 голосов
/ 07 апреля 2009

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


Среда: Windows Server 2003 SP2; IIS v6; Классический ASP; 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)

Приложение пыталось использовать окно класс, который не был класс для конкретного приложения зарегистрирован с системой или одним из предопределенные классы управления (такие как КНОПКА, СПИСОК, СКРОЛБАР и т. Д. на).

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

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

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

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

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

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

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

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

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

Спасибо, что прочитали это далеко.

1 Ответ

0 голосов
/ 17 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...