Client per inviare richiesta SOAP e risposta ricevuta

Cercando di creare un client C # (sarà sviluppato come servizio Windows) che invia richieste SOAP a un servizio web (e ottiene i risultati).

Da questa domanda ho visto questo codice:

protected virtual WebRequest CreateRequest(ISoapMessage soapMessage) { var wr = WebRequest.Create(soapMessage.Uri); wr.ContentType = "text/xml;charset=utf-8"; wr.ContentLength = soapMessage.ContentXml.Length; wr.Headers.Add("SOAPAction", soapMessage.SoapAction); wr.Credentials = soapMessage.Credentials; wr.Method = "POST"; wr.GetRequestStream().Write(Encoding.UTF8.GetBytes(soapMessage.ContentXml), 0, soapMessage.ContentXml.Length); return wr; } public interface ISoapMessage { string Uri { get; } string ContentXml { get; } string SoapAction { get; } ICredentials Credentials { get; } } 

Sembra bello, qualcuno sa come usarlo e se è la migliore pratica?

Tuttavia, di solito uso un altro modo per fare lo stesso

 using System.Xml; using System.Net; using System.IO; public static void CallWebService() { var _url = "http://xxxxxxxxx/Service1.asmx"; var _action = "http://xxxxxxxx/Service1.asmx?op=HelloWorld"; XmlDocument soapEnvelopeXml = CreateSoapEnvelope(); HttpWebRequest webRequest = CreateWebRequest(_url, _action); InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest); // begin async call to web request. IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); // suspend this thread until call is complete. You might want to // do something usefull here like update your UI. asyncResult.AsyncWaitHandle.WaitOne(); // get the response from the completed web request. string soapResult; using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult)) { using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) { soapResult = rd.ReadToEnd(); } Console.Write(soapResult); } } private static HttpWebRequest CreateWebRequest(string url, string action) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Headers.Add("SOAPAction", action); webRequest.ContentType = "text/xml;charset=\"utf-8\""; webRequest.Accept = "text/xml"; webRequest.Method = "POST"; return webRequest; } private static XmlDocument CreateSoapEnvelope() { XmlDocument soapEnvelopeDocument = new XmlDocument(); soapEnvelopeDocument.LoadXml(@"1232"); return soapEnvelopeDocument; } private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest) { using (Stream stream = webRequest.GetRequestStream()) { soapEnvelopeXml.Save(stream); } } 

Ho questa semplice soluzione qui :

Invio di richiesta SOAP e ricezione di risposta in .NET 4.0 C # senza utilizzare le classi WSDL o proxy:

 class Program { ///  /// Execute a Soap WebService call ///  public static void Execute() { HttpWebRequest request = CreateWebRequest(); XmlDocument soapEnvelopeXml = new XmlDocument(); soapEnvelopeXml.LoadXml(@"     "); using (Stream stream = request.GetRequestStream()) { soapEnvelopeXml.Save(stream); } using (WebResponse response = request.GetResponse()) { using (StreamReader rd = new StreamReader(response.GetResponseStream())) { string soapResult = rd.ReadToEnd(); Console.WriteLine(soapResult); } } } ///  /// Create a soap webrequest to [Url] ///  ///  public static HttpWebRequest CreateWebRequest() { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"http://localhost:56405/WebService1.asmx?op=HelloWorld"); webRequest.Headers.Add(@"SOAP:Action"); webRequest.ContentType = "text/xml;charset=\"utf-8\""; webRequest.Accept = "text/xml"; webRequest.Method = "POST"; return webRequest; } static void Main(string[] args) { Execute(); } } 

La procedura consigliata è fare riferimento al WSDL e utilizzarlo come riferimento per i servizi Web. Più facile e funziona bene, ma se non si dispone delle definizioni WSDL o XSD è un buon codice di codice.

Penso che ci sia un modo più semplice:

  public async Task CreateSoapEnvelop() { string soapString = @"     "; HttpResponseMessage response = await PostXmlRequest("your_url_here", soapString); string content = await response.Content.ReadAsStringAsync(); return content; } public static async Task PostXmlRequest(string baseUrl, string xmlString) { using (var httpClient = new HttpClient()) { var httpContent = new StringContent(xmlString, Encoding.UTF8, "text/xml"); httpContent.Headers.Add("SOAPAction", "http://tempuri.org/HelloWorld"); return await httpClient.PostAsync(baseUrl, httpContent); } } 

Ho scritto una class helper più generale che accetta un dizionario basato su stringhe di parametri personalizzati, in modo che possano essere impostati dal chiamante senza doverli codificare. Va da sé che si dovrebbe usare tale metodo solo quando si desidera (o si ha bisogno) di emettere manualmente un servizio Web basato su SOAP: negli scenari più comuni l’approccio raccomandato sarebbe l’utilizzo del WSDL del servizio Web insieme al servizio di aggiunta di riferimento Visual Studio funzione invece.

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Xml; namespace Ryadel.Web.SOAP { ///  /// Helper class to send custom SOAP requests. ///  public static class SOAPHelper { ///  /// Sends a custom sync SOAP request to given URL and receive a request ///  /// The WebService endpoint URL /// The WebService action name /// A dictionary containing the parameters in a key-value fashion /// The SOAPAction value, as specified in the Web Service's WSDL (or NULL to use the url parameter) /// Set this to TRUE to use the SOAP v1.2 protocol, FALSE to use the SOAP v1.1 (default) /// A string containing the raw Web Service response public static string SendSOAPRequest(string url, string action, Dictionary parameters, string soapAction = null, bool useSOAP12 = false) { // Create the SOAP envelope XmlDocument soapEnvelopeXml = new XmlDocument(); var xmlStr = (useSOAP12) ? @"   <{0} xmlns=""{1}"">{2}  " : @"   <{0} xmlns=""{1}"">{2}  "; string parms = string.Join(string.Empty, parameters.Select(kv => String.Format("<{0}>{1}", kv.Key, kv.Value)).ToArray()); var s = String.Format(xmlStr, action, new Uri(url).GetLeftPart(UriPartial.Authority) + "/", parms); soapEnvelopeXml.LoadXml(s); // Create the web request HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Headers.Add("SOAPAction", soapAction ?? url); webRequest.ContentType = (useSOAP12) ? "application/soap+xml;charset=\"utf-8\"" : "text/xml;charset=\"utf-8\""; webRequest.Accept = (useSOAP12) ? "application/soap+xml" : "text/xml"; webRequest.Method = "POST"; // Insert SOAP envelope using (Stream stream = webRequest.GetRequestStream()) { soapEnvelopeXml.Save(stream); } // Send request and retrieve result string result; using (WebResponse response = webRequest.GetResponse()) { using (StreamReader rd = new StreamReader(response.GetResponseStream())) { result = rd.ReadToEnd(); } } return result; } } } 

Per ulteriori informazioni e dettagli su questo corso puoi anche leggere questo post .