2009-08-11 7 views
1

J'écris un client de service Web en C# qui prend l'URL du service Web et un nom de méthode Web.Comment appeler dynamiquement des services Web dans .Net

Je veux vérifier si la méthode WebW reçoit réellement un int et retourne un DataTable, et si cela est vrai, il devrait l'appeler et retourner le DataTable.

J'ai trouvé quelques messages où ceci est accompli en compilant dynamiquement la classe Proxy. Mais pour mon cas, ce serait trop cher, car le client est en fait un WebPart WSS, et je ne veux pas le faire à chaque fois que la page est rendue; seulement quand les propriétés sont changées.

Répondre

3

En fin de journée, la description du service web est juste un fichier XML. Vous pouvez le saisir en demandant Service.asmx WSDL:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string xml = reader.ReadToEnd(); 

Une fois que vous avez la description du service, vous pouvez l'analyser et vérifier la signature de la méthode. Ensuite, vous pouvez appeler la méthode en utilisant HTTP POST:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld"); 
request.Method = "POST"; 
request.ContentType = "application/soap+xml; charset=utf-8"; 

byte[] data = Encoding.UTF8.GetBytes(
    @"<?xml version='1.0' encoding='utf-8'?> 
    <soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'> 
    <soap12:Body> 
     <HelloWorld xmlns='http://tempuri.org/' /> 
    </soap12:Body> 
    </soap12:Envelope>"); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string xml = reader.ReadToEnd(); 
+0

Thks Pavel! Je vais y aller Et essayer ... J'ai aussi trouvé quelques infos sur l'objet ServiceDescription qui, je pense, peuvent m'aider à vvalider le WSDL. –

1

Si le service Web est toujours le même (c'est-à-dire que la méthode est la même que celle renvoyée) et uit est l'URL qui peut changer, ajoutez simplement une référence Web au projet avec la partie web, l'ensemble de l'Url du proxy comme suit:

using (var serviceProxy = new ServiceProxy()) 
{ 
    serviceProxy.Url = somepropertysetbythewebpart; 
    // make call to method here 
} 
+0

En fait, les deux choses peuvent changer ... Je pourrais être à l'adresse http: //someurl/someservice.asmx dans une page, mais dans une autre cela pourrait être http: //someurl/anotherservice.asmx, et le nom de la méthode appelée peut aussi changer ... –

0

Après beaucoup de resarching j'ai découvert comment faire. Le code de la réponse sélectionnée est presque là, mais j'ai dû ajouter le SOAPAction dans l'en-tête et aussi changer le ContentType.

Voici le code entier:

var strRequest = @"<soap12:Envelope> 
        ... 
        </soap12:Envelope>"; 

string webServiceUrl = "http://localhost:8080/AccontService.svc"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl); 

request.Method = "POST"; 
request.ContentType = "text/xml;charset=UTF-8";   
request.Accept = "text/xml"; 
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount"); 

byte[] data = Encoding.UTF8.GetBytes(strRequest); 

request.ContentLength = data.Length; 
Stream requestStream = request.GetRequestStream(); 
requestStream.Write(data, 0, data.Length); 
requestStream.Close(); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
string responseXmlString = reader.ReadToEnd(); 

return new HttpResponseMessage() 
{ 
    Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml") 
}; 
Questions connexes