2009-04-07 9 views
0

Je reçois une erreur lors de l'utilisation de l'objet MsXml.ServerXmlHttp de JScript sous ASP classique lorsque l'appel est asynchrone. Le message d'erreur est "Impossible de trouver la classe de fenêtre"Erreur ServerXMLHTTP: Classe de fenêtre introuvable


L'environnement est: Windows Server 2003 SP2; IIS v6; ASP classique; JScript

Lorsque ServerXmlHttp.open est appelé avec asynch = true, l'erreur se produit sur la méthode send. Lorsque ServerXmlHttp.open est appelé avec asynch = false, l'erreur ne se produit pas

Le code fonctionne sur un environnement de test qui a toutes les mêmes versions de produits principaux (bien qu'il n'ait pas été conservé identique à l'environnement de production)

Dans l'environnement de test, le code fonctionne à la fois synchrone et asynchrone ouvert

l'erreur se produit lors de l'utilisation MSXML2.ServerXMLHTTP.6.0 MSXML2.ServerXMLHTTP.4.0

MSXML2.ServerXMLHTTP.2.0

Le code échoue de la même manière indépendamment de l'URL: google.com et stackoverflow.com échouent tout comme la page réelle que j'ai besoin d'appeler

Dans l'environnement de test google.com, stackoverflow.com et la page I besoin d'appeler tout le travail.

L'erreur se produit indépendamment du fait que j'utilise un GET ou POST

L'erreur se produit indépendamment des en-têtes.

L'erreur se produit indépendamment du fait que le protocole soit HTTP ou HTTPS.

L'erreur se produit très rapidement - presque définitivement côté client.

L'erreur ne se produit PAS lorsque la connexion est synchrone.

J'ai réinstallé msxml6.msi

Je l'ai utilisé « proxycfg.exe -d » pour configurer la pile Internet à ne pas utiliser un proxy. (http://support.microsoft.com/kb/289481/)


Voici un exemple de code indicatif (je l'ai simplifié parce que je ne pense pas que le code est le problème):

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

Ce code génère l'erreur: « ne peut pas find window class "sur l'appel xmlServerHttp.send.

C'est ce que MSDN dit à propos de l'erreur (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).

Cet article de base de connaissances (http://support.microsoft.com/kb/303326) contient la note spécifique asynchrone suivante:

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 existe dans le dossier system32 du serveur. Cependant, il n'existe pas sur le serveur de test où le code fonctionne en mode asynchrone: S.(Je n'ai pas explicitement installé urlmon.dll - il était juste là quand je suis allé le chercher.)

Je suppose qu'il y a un problème de configuration ou d'installation sur le serveur. Peut-être qu'une dextérité MSXML est manquante. Mais je ne sais pas comment enquêter davantage. Est-ce que quelqu'un a des suggestions?

En particulier, quelqu'un peut me dire:

  • Ce que les dépendances de MsXml.ServerXmlHttp sont?

    ou comment je peux les comprendre.

  • Que signifie le message d'erreur "Impossible de trouver une classe de fenêtre" dans ce contexte?

  • Existe-t-il des paramètres ou des configurations spécifiques aux appels HTTP asynchrones?

Merci d'avoir lu jusqu'ici.

+0

quel tumbleweed ... je suppose que l'écriture de longue question comme celle-ci est une façon d'obtenir ce badge;) –

Répondre

0

La nature à un seul thread d'ASP avec les objectifs COM ne vous permettra pas de gérer les événements asynchrones comme vous pourriez le penser.

On pourrait penser que c'était possible en se référant à un gestionnaire d'événements déclaré en global.asa, mais je doute que cela fonctionne.

Votre code est totalement inutile, puisque vous essayez de reproduire exactement ce que fait async=false. Vous pouvez contrôler le délai d'expiration à l'aide de la méthode setTimeout().

Questions connexes