javascript - ServerXMLHTTP Fejl: Kan ikke finde vinduesklasse

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg får en fejl ved at bruge MsXml.ServerXmlHttp-objektet fra JScript under klassisk ASP, når opkaldet er asynkront. Fejlmeddelelsen er 'kan ikke finde vinduesklasse'





Miljøet er: Windows Server 2003 SP2; IIS v6; Klassisk ASP; JScript


Når ServerXmlHttp.open hedder asynch=true, opstår fejlen ved sendemetoden.
Når ServerXmlHttp.open hedder asynch=false, forekommer fejlen ikke


Koden virker på et testmiljø, der har alle de samme versioner af større produkter (selv om det ikke er blevet holdt identisk med produktionsmiljøet)


I testmiljøet fungerer koden med både en synkron og en asynkron åben


Fejlen opstår ved brug
    MSXML2.ServerXMLHTTP.6.0
    MSXML2.ServerXMLHTTP.4.0
    MSXML2.ServerXMLHTTP.2.0


Koden fejler på samme måde uanset webadressen: google.com og stackoverflow.com fejler ligesom den aktuelle side, jeg skal ringe til


I testmiljøet google.com, stackoverflow.com og siden jeg skal ringe til alt arbejde.


Fejlen opstår, uanset om jeg bruger en GET eller en POST


Fejlen opstår uanset hovedene.


Fejlen opstår, uanset om protokalen er HTTP eller HTTPS.


Fejlen sker meget hurtigt - næsten helt klart klientsiden.


Fejlen sker IKKE, når forbindelsen er synkron.


Jeg har geninstalleret MSXML6.msi


Jeg har brugt 'proxycfg.exe -d' til at konfigurere internetstakken til IKKE at bruge en proxy. (Http://support.microsoft.com/kb/289481/)[5]





Her er en vejledende kodeeksempel (jeg har forenklet det fordi jeg ikke tror, ​​at koden er problemet):


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


Denne kode kaster fejlen: 'kan ikke finde vinduesklasse' på xmlServerHttp.send-opkaldet.


Dette er hvad MSDN siger om fejlen (http://msdn.microsoft.com/en-us/library/ms820745.aspx)[6]



  En ansøgning forsøgte at bruge et vindue
  klasse, der ikke var en
  ansøgningsspecifik klasse registreret
  med systemet eller en af ​​de
  foruddefinerede kontrolklasser (f.eks
  KNAPP, LISTBOX, SCROLLBAR, og så
  på).



Denne videnbaserede artikel (http://support.microsoft.com/kb/303326) indeholder følgende asynkrone-specifikke note: [7]



  ServerXMLHTTP bruger ikke Urlmon.dll.
  Men når du bruger ServerXMLHTTP i
  asynkron tilstand, har du også brug for dette
  meddelelsespumpe, fordi parseren brænder
  begivenheden ved at sende meddelelser tilbage til
  tråden.



Urlmon.dll findes i system32-mappen på serveren. Men det eksisterer ikke på testserveren, hvor koden virker i asynkron tilstand: S. (Jeg installerede ikke eksplicit urlmon.dll - det var bare der, da jeg gik hen til kigge efter det.)


Mit gæt er, at der er noget konfigurations- eller installationsproblem på serveren. Måske mangler en MSXML-depedens. Men jeg ved ikke, hvordan man skal undersøge yderligere. Har nogen nogen forslag?


Kan nogen især fortælle mig:



  • Hvad afhængigheden af ​​MsXml.ServerXmlHttp er?


    eller hvordan jeg kan finde ud af dem.

  • Hvad kan fejlmeddelelsen 'ikke finde vinduesklasse' betyde i denne sammenhæng?

  • Er der nogen indstillinger eller konfigurationer, der er specifikke for asynkrone HTTP-opkald?



Tak for at have læst det her langt.

Bedste reference


ASP med single-threaded natur med COM objecs giver dig ikke mulighed for at håndtere async events som du måske tror.


Man tror måske, at dette var muligt ved at henvise til en eventhandlinger, der er erklæret i global.asa, men jeg tvivler på, at det vil fungere.


Din kode er helt meningsløs, da du forsøger at duplikere præcis hvad async=false gør. Du kan kontrollere timeout ved hjælp af metoden setTimeout().