2010-07-30 9 views
2

Nous avons des difficultés à déployer un service Web qui fonctionne dans notre environnement de développement, mais pas en production. Une partie du problème réside dans le fait que nos serveurs de production sont équilibrés en charge, donc pour mettre à niveau un des serveurs, nous devons le sortir du load-balance et essayer de tester le serveur en isolation, ce qui est un défi.Pourquoi puis-je accéder à un fichier WSDL à partir d'un navigateur, mais pas à partir d'une application?

L'ordinateur sur lequel je travaille est appelé Web01 et l'ordinateur que j'utilise pour tester s'appelle Ts01. Sur les deux machines, j'ai modifié le fichier hosts pour rediriger mydomain.com vers l'adresse IP appropriée du site Web sur Web01.

Je teste deux façons d'accéder au service Web sur chaque machine:

  • Un simple appel de navigateur pour http://www.mydomain.com/services/myservice.asmx?WSDL.
  • Application de test VB6 qui appelle le service Web à l'aide du WSDL référencé ci-dessus via SOAPClient.

Voici les résultats du test:

 
        Browser    VB6 App 
    Ts01    OK     OK 
    Web01   OK     ERROR 

Le test semble fonctionner correctement pour toutes les situations, sauf l'application VB6 installé sur le serveur Web. L'erreur que j'obtenons est:

-2147024809 - WSDLReader: Chargement du fichier WSDL n'a pas HRESULT = 0x80070057 - WSDLReader: XML Parser a échoué à linenumber 0, LinePosition 0, la raison est: Le système ne peut pas localiser l'objet spécifié .

HRESULT = 0x1

je reçois la même erreur de retour sur Ts01 si je fournir une mauvaise adresse WSDL dans l'application VB6. Il semble que l'application VB6 sur Web01 ne peut pas accéder à la DLL de service Web sur Web01, ce qui est un gros problème.

Il est peut-être intéressant de noter que cela fonctionne également sur ma machine de développement locale, où l'application VB6 et le service Web sont installés sur la même machine. Pourquoi l'application VB6 rencontre-t-elle des difficultés pour communiquer avec le service Web via SOAPClient lorsqu'elle est exécutée à partir de la même boîte que le service Web? J'ai utilisé fiddler pour inspecter les en-têtes des requêtes sur ma machine locale appelant notre serveur dev. Voici la différence entre les demandes de navigateur et soapclient:

Navigateur:

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-shockwave-flash, */* 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
Host: devserver 
Cookie: SIFR-PREFETCHED=true 

SOAPClient (VB6 App):

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Host: hbhswebnet 
Connection: Keep-Alive 
Pragma: no-cache 

Je ne sais pas si cette information est utile, mais peut-être c'est.

+0

Avez-vous considéré qu'il s'agissait peut-être d'une erreur d'autorisation? Il est possible que l'application VB6 sur Web01 n'ait pas l'autorisation d'effectuer un appel SOAPClient. –

+0

Je ne crois pas que ce soit un problème de programmation; il appartient à ServerFault –

+0

Êtes-vous accéder à la machine distante via un proxy Web? –

Répondre

3

Voici un schéma général:

Q: « x » fonctionne dans le navigateur, mais échoue dans un programme qui fait la même chose que le navigateur est en train de faire. Qu'est-ce qui ne va pas? R: le programme est et non faire la même chose que le navigateur.

Les navigateurs définissent explicitement les en-têtes que votre programme ne définit pas (en particulier puisque vous utilisez le SOAPClient très obsolète). Divers éléments de l'équipement de réseau et des logiciels peuvent regarder ces en-têtes en décidant comment répondre à vos demandes. Vous devriez regarder le trafic réseau pour les deux cas (navigateur et programme) en utilisant Fiddler ou quelque chose, puis regardez attentivement les différences entre le comportement du navigateur et le comportement de votre programme. Vous pouvez alors soit modifier le programme pour qu'il ressemble au navigateur, soit demander à vos employés de réseau de réduire la sécurité afin que votre programme puisse accéder au service.

+0

c'est un excellent conseil, esp. l'idée d'utiliser Fiddler. Je n'avais pas pensé à faire cela pour examiner les en-têtes de la requête. Je suppose que ce qui m'a le plus surpris, c'est que ça * fonctionne * sur une machine, mais pas sur la machine qui sera responsable de faire l'appel. –

+0

@Ben: sur la base des en-têtes que vous avez publiés, je demanderais aux gens du réseau ce SIFR-PREFETCHED = true cookie. –

0

Une autre chose à regarder est les paramètres de proxy dans le navigateur, êtes-vous en passant par un proxy? VB6 récupère certains, mais pas tous les paramètres de proxy à partir d'Internet Explorer, mais aucun des autres navigateurs.

Si Fiddler ne fonctionne pas, vous devrez peut-être enrouler vos sleaves et explorer Wireshark pour savoir pourquoi VB6 ne communique pas.

Une autre chose importante à regarder est: quel client SOAP utilisez-vous? (Microsofts client archaïque et buggy, PocketSOAP, quelque chose de brassé à la maison?) Une suggestion pourrait être d'écrire un proxy de savon pour. Net, puis utiliser interop pour travailler avec votre savon.

0

« erreur WSDLReader '80020009' WSDLReader: XML Parser a échoué à linenumber 0, LinePosition 0, la raison est: Le nom du serveur ou l'adresse ne peuvent pas être résolus HRESULT = 0x1. Fonction incorrecte - WSDLReader: Chargement du fichier WSDL HRESULT = 0x80070057: Le paramètre est incorrect - Client: Un des paramètres fournis est invalide HRESULT = 0x80070057: Le paramètre est incorrect. "

Windows Update corrompu le registre et l'application web n'initieront aucun objet lié à votre web service et vous obtiendrez cette erreur. Essayez de vous réinscrire sur les clients SOAP et les DLL SOAP ou essayez de les réinstaller.

+0

Avez-vous lu la réponse acceptée? –

0

Il est probable que les fichiers WSDL et/ou le service lui-même nécessitent une authentification. Dans mon cas (en supposant que Basic Auth) Je devais fournir des informations à l'URL de connexion SOAP, donc:

http://www.mydomain.com/services/myservice.asmx?WSDL 

devient:

http://user:[email protected]/services/myservice.asmx?WSDL 

Bien sûr, cela est totalement sécurisé sur l'Internet public, donc vous devriez utiliser HTTPS. Vous devez également limiter les connexions aux hôtes approuvés si possible.

Cela peut ou peut ne pas fonctionner avec certaines mises à jour de sécurité à votre navigateur ou avec MSXML:

https://support.microsoft.com/default.aspx?scid=kb;en-us;832414

Dans ce cas, vous devrez peut-être fournir les informations d'identification à l'aide d'autres méthodes. Si vous pouvez obtenir le fichier WSDL accessible sans informations d'identification, vous pouvez toujours obtenir le service avec des informations d'identification et de les transmettre dans l'enveloppe SOAP:

sc.ssoapinit(WSDLURL) 
    sc.ConnectorProperty("AuthUser") = "user" 
    sc.ConnectorProperty("AuthPassword") = "password" 
0

eu le même problème. Le code fonctionnerait sur ma machine mais pas sur les clients. J'ai dû charger IE-Tools-Internet Options et cliquer sur Advanced. Faites défiler jusqu'à Sécurité et décoché "Ne pas enregistrer les pages chiffrées sur le disque".