2010-08-27 4 views
2

J'utilise l'exemple de code pour appeler dynamiquement un service Web à partir de ce site: http://www.crowsprogramming.com/archives/66Dynamiquement Invoke Web Service à l'exécution

La question que je suis confronté est quand j'utiliser la classe pour appeler un service Web à partir d'un application web je reçois l'erreur suivante: « l'hôte distant ne peut pas être trouvé » et l'erreur se produit à la ligne de code suivante: si

Mais si je l'utilise (ServiceDescription.CanRead (de xmlreader)!) le même code à partir d'une application Windows pour se connecter au web service: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL

cela fonctionne très bien. Je ne suis pas sûr de savoir comment résoudre ce problème. Est-ce que quelqu'un d'autre a fait face au même problème et a été en mesure de le résoudre alors apprécierait quelques indications dans la bonne direction.

Répondre

0

Le problème pour moi était le proxy à utiliser pour se connecter à Internet. Le code doit changer aux deux endroits pour le bon fonctionnement suivants:

1] La méthode BuildServiceDescriptionImporter (XmlTextReader xmlreader) a été changé pour

private ServiceDescriptionImporter BuildServiceDescriptionImporter(string webserviceUri) 
    { 
     ServiceDescriptionImporter descriptionImporter = null; 

     **WebClient client = new WebClient { Proxy = new WebProxy(string host, int port) };** 

     Stream stream = client.OpenRead(webserviceUri); 

     XmlTextReader xmlreader = new XmlTextReader(stream); 

     // parse wsdl 
     ServiceDescription serviceDescription = ServiceDescription.Read(xmlreader); 

     // build an importer, that assumes the SOAP protocol, client binding, and generates properties 
     descriptionImporter = new ServiceDescriptionImporter(); 
     descriptionImporter.ProtocolName = "Soap12"; 
     descriptionImporter.AddServiceDescription(serviceDescription, null, null); 
     descriptionImporter.Style = ServiceDescriptionImportStyle.Client; 
     descriptionImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties; 

     return descriptionImporter; 
    } 

2] Le deuxième morceau de code qui devait être changé était dans la méthode public T InvokeMethod<T>(string serviceName, string methodName, params object[] args)

ajouter l'extrait de code suivant avant la méthode Invoquer:

PropertyInfo Proxy = type.GetProperty("Proxy"); 

WebProxy webProxy = new WebProxy(string host, int port); 

Proxy.SetValue(serviceInstance, webProxy, null); 

Après avoir fait ces changements, j'ai pu utiliser le code pour me connecter à un service web distant dynamiquement.

J'espère que cela aidera d'autres personnes confrontées au même problème que moi.

+0

-1: utilise la technologie ASMX héritage, qui ne devrait pas être utilisé pour un nouveau développement; En outre, il manque des blocs 'using' et utilise' new XmlTextReader' au lieu de 'XmlReader.Create'. –

0

Le code ci-dessus a besoin d'un peu plus:

ServiceDescription serviceDescription; 
using (WebClient client = new WebClient {Proxy = new WebProxy(host, port)}) 
{ 
    using (Stream stream = client.OpenRead(webserviceUri)) 
    { 
     using (XmlReader xmlreader = XmlReader.Create(stream)) 
     { 
      serviceDescription = ServiceDescription.Read(xmlreader); 
     } 
    } 
} 

WebClient, Stream et XmlReader tout mettre en œuvre IDisposable, devrait donc être créé dans un bloc using lorsque leur utilisation est uniquement scope localement. En outre, new XmlTextReader() a été dépréciée depuis .NET 2.0, et devrait être remplacé par XmlReader.Create.

(réponse faite CW parce qu'il est vraiment juste un commentaire formaté)

Questions connexes