2010-06-04 6 views
5

J'essaye d'écrire une fonction qui peut appeler un webmethod d'une webserive donné le nom de la méthode et l'URL du webservice. J'ai trouvé du code sur un blog qui fonctionne bien, sauf pour un détail. Il nécessite que la requête XML soit également fournie. L'objectif ici est d'obtenir le modèle XML de demande à partir du service Web lui-même. Je suis sûr que c'est possible d'une manière ou d'une autre parce que je peux voir les modèles XML de demande et de réponse si j'accède à l'URL d'un webservice dans mon navigateur.Appelez par programme webmethods en C#

C'est le code qui appelle la webmethod programme:

XmlDocument doc = new XmlDocument(); 
//this is the problem. I need to get this automatically 
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld"); 
req.ContentType = "text/xml;charset=\"utf-8\""; 
req.Accept = "text/xml"; 
req.Method = "POST"; 
Stream stm = req.GetRequestStream(); 
doc.Save(stm); 
stm.Close(); 
WebResponse resp = req.GetResponse(); 
stm = resp.GetResponseStream(); 
StreamReader r = new StreamReader(stm); 
Console.WriteLine(r.ReadToEnd()); 
+0

Comment pouvez-vous appeler une méthode (service web ou autre) si vous ne savez pas à l'avance quels sont les paramètres nécessaires? –

+0

Supposons pour l'instant que ces méthodes web n'exigent aucun paramètre. – hancock

+0

Le service Web expose-t-il une description WSDL? – dariom

Répondre

2

Après les commentaires ci-dessus. Si vous avez un fichier WSDL qui décrit votre service, vous l'utilisez comme information requise pour communiquer avec votre service Web. L'utilisation d'une classe proxy pour communiquer avec votre proxy de service est un moyen facile de vous extraire de la plomberie sous-jacente de HTTP et XML.

Il existe des façons de le faire lors de l'exécution - en générant essentiellement le code généré par Visual Studio lorsque vous ajoutez une référence de service Web à votre projet. J'ai utilisé une solution basée sur: this newsgroup question, mais il y a aussi other examples out there.

+0

Oui, cela semble être une bonne approche. Merci d'avoir répondu. – hancock

0

FYI, votre code manque using blocs. Cela devrait ressembler plus à ceci:

XmlDocument doc = new XmlDocument(); 
//this is the problem. I need to get this automatically 
doc.Load("../../request.xml"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld"); 
req.ContentType = "text/xml;charset=\"utf-8\""; 
req.Accept = "text/xml"; 
req.Method = "POST"; 

using (Stream reqstm = req.GetRequestStream()) 
{ 
    doc.Save(reqstm); 
} 

using (WebResponse resp = req.GetResponse()) 
{ 
    using (Stream respstm = resp.GetResponseStream()) 
    { 
     using (StreamReader r = new StreamReader(respstm)) 
     { 
      Console.WriteLine(r.ReadToEnd()); 
     }  
    } 
} 
+0

Vous avez raison, mais j'ai utilisé la solution de dariom qui n'utilise pas ce morceau de code. – hancock

Questions connexes