2009-04-07 3 views
0
nicht gefunden

Ich erhalte einen Fehler mit dem MsXml.ServerXmlHttp-Objekt aus JScript unter klassischen ASP, wenn der Aufruf asynchron ist. Die Fehlermeldung lautet "Fensterklasse kann nicht gefunden werden"ServerXMLHTTP Fehler: Fensterklasse


Die Umgebung ist: Windows Server 2003 SP2; IIS v6; Klassisches ASP; JScript

Wenn ServerXmlHttp.open mit asynch = true aufgerufen wird, tritt der Fehler bei der send-Methode auf. Wenn ServerXmlHttp.open mit asynch = false aufgerufen wird, tritt der Fehler nicht auf

Der Code funktioniert in einer Testumgebung, die alle die gleichen Versionen von Hauptprodukten enthält (obwohl es nicht identisch mit der Produktionsumgebung gehalten wurde)

In der Testumgebung der Code sowohl mit synchronen und asynchronen offenen

der Fehler, wenn MSXML2.ServerXMLHTTP.6.0 MSXML2.ServerXMLHTTP.4.0 MSXML2.ServerXMLHTTP.2.0

Verwendung erfolgt funktioniert

Der Code schlägt auf die gleiche Weise unabhängig von der URL: google.com und stackoverflow.com scheitern genau wie die tatsächliche Seite, die ich anrufen muss

In der Testumgebung google.com, stackoverflow.com und die Seite I müssen alle Arbeiten anrufen.

Der Fehler tritt unabhängig davon, ob ich eine GET oder eine POST verwenden

Der Fehler tritt auf, unabhängig von den Header.

Der Fehler tritt unabhängig davon auf, ob das Protokoll HTTP oder HTTPS ist.

Der Fehler passiert sehr schnell - fast definitiv Client-Seite.

Der Fehler tritt NICHT auf, wenn die Verbindung synchron ist.

ich neu installiert haben MSXML6.msi

ich verwendet habe "proxycfg.exe -d" Internet-Stack konfigurieren keinen Proxy verwenden. (http://support.microsoft.com/kb/289481/)


Hier ein vorläufiges Codebeispiel ist (ich habe es vereinfacht, weil ich nicht glaube, der Code das Problem ist):

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); 

Dieser Code den Fehler wirft: „kann nicht finde die Fensterklasse "auf dem xmlServerHttp.send-Aufruf.

Dies ist, was sagt MSDN über den Fehler (http://msdn.microsoft.com/en-us/library/ms820745.aspx)

An application tried to use a window class that was not an application-specific class registered with the system or one of the predefined control classes (such as BUTTON, LISTBOX, SCROLLBAR, and so on).

Dieser Knowledge Base-Artikel (http://support.microsoft.com/kb/303326) enthält folgende asynchrone spezifische Anmerkung:

ServerXMLHTTP does not use Urlmon.dll. However, when you use ServerXMLHTTP in asynchronous mode, you also need this message pump because the parser fires the event by posting messages back to the thread.

Urlmon.dll in existiert der System32-Ordner des Servers. Es ist jedoch nicht auf dem Testserver vorhanden, auf dem der Code im asynchronen Modus ausgeführt wird: S.(Ich habe urlmon.dll nicht explizit installiert - es war nur da, als ich danach suchte.)

Meine Vermutung ist, dass es einige Konfigurations- oder Installationsprobleme auf dem Server gibt. Möglicherweise fehlt eine MSXML-Abhängigkeit. Aber ich weiß nicht, wie ich weiter nachforschen soll. Hat jemand irgendwelche Vorschläge?

Insbesondere kann mir jemand sagen:

  • Was die Abhängigkeiten von MsXml.ServerXmlHttp sind?

    oder wie ich sie herausfinden kann.

  • Was bedeutet die Fehlermeldung "Fensterklasse nicht finden" in diesem Zusammenhang?

  • Gibt es Einstellungen oder Konfigurationen, die spezifisch für asynchrone HTTP-Aufrufe sind?

Danke fürs Lesen so weit.

+0

was für ein Tumbleweed ... ich denke, das Schreiben von langwierigen Fragen wie diesem ist eine Möglichkeit, dieses Abzeichen zu bekommen;) –

Antwort

0

Die single-threaded-Eigenschaft von ASP mit COM-Objecs wird es Ihnen nicht erlauben, asynchrone Ereignisse zu behandeln, wie Sie vielleicht denken.

Man könnte denken, dass dies möglich war, indem man auf einen Event-Handler Bezug nimmt, der in global.asa deklariert ist, aber ich bezweifle, dass das funktionieren wird.

Ihr Code ist völlig sinnlos, da Sie versuchen genau das zu duplizieren, was async=false tut. Sie können das Zeitlimit mithilfe der Methode setTimeout() steuern.