Я получаю сообщение об ошибке, используя объект 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-вызовам?
Спасибо, что дочитали до этого места.