Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpClient & SOAP (C#)

I'm trying to use the HttpClient class to send a SOAP message:

Doing so with REST seems easy (code from here) :

using System; using System.Net.Http; using System.Json;  namespace ConsoleApplication39 { class Program { static void Main(string[] args) {  HttpClient proxy = new HttpClient(); proxy.GetAsync("http://localhost:14892/api/Bloggers").ContinueWith((r) => { HttpResponseMessage response = r.Result; response.Content.ReadAsAsync<JsonArray>().ContinueWith( (a)=> { foreach(var w in a.Result) { Console.WriteLine(w.ValueOrDefault("Name").ToString()); Console.WriteLine(w.ValueOrDefault("Intrest").ToString()); } });  });  Console.ReadKey(true);  }  } } 

I would like to do something similar with SOAP.

I have the host (http://opensearch.addi.dk/2.2/) and the SOAP message to POST:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://oss.dbc.dk/ns/opensearch">   <SOAP-ENV:Body>     <ns1:searchRequest>       <ns1:query>dc.title=zorro AND dc.type=bog</ns1:query>       <ns1:agency>100200</ns1:agency>       <ns1:profile>test</ns1:profile>       <ns1:start>1</ns1:start>       <ns1:stepValue>10</ns1:stepValue>     </ns1:searchRequest>   </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

... but how to send it ?

I'll admit that this is the first SOAP Web Service I have ever used so I may have no idea what I'm doing, but in its simplest form could it be something like :

HttpClient hc = new HttpClient(); hc.BaseAddress = new Uri("http://opensearch.addi.dk/2.2/");      HttpContent content = *... something*      HttpResponseMessage rm = await hc.PostAsync("http://opensearch.addi.dk/2.2/", content); 

I assume that the SOAP message should somehow be created through a HttpContent static method like HttpContent.Create(..) but I can't get that to work ...

I know this is a dumb question but I still need help :) !

tia ...

like image 870
user1086115 Avatar asked Jan 15 '13 11:01

user1086115


People also ask

What is meant by HttpClient?

An HTTP Client. An HttpClient can be used to send requests and retrieve their responses. An HttpClient is created through a builder . The builder can be used to configure per-client state, like: the preferred protocol version ( HTTP/1.1 or HTTP/2 ), whether to follow redirects, a proxy, an authenticator, etc.

What is the use of HttpClient?

The HttpClient class instance acts as a session to send HTTP requests. An HttpClient instance is a collection of settings applied to all requests executed by that instance. In addition, every HttpClient instance uses its own connection pool, isolating its requests from requests executed by other HttpClient instances.

What is HttpClient in REST API?

Apache HttpClient is a robust and complete solution Java library to perform HTTP operations, including RESTful service. In this tutorial, we show you how to create a RESTful Java client with Apache HttpClient, to perform a “GET” and “POST” request. Note.

What is the use of HttpClient in C#?

HttpClient class provides a base class for sending/receiving the HTTP requests/responses from a URL. It is a supported async feature of . NET framework. HttpClient is able to process multiple concurrent requests.


1 Answers

I needed to do this myself and since I couldn't find any answers online, here's what I worked out. This uses a simple SOAP calculator service with an 'Add' method that takes two numbers and returns the sum.

public async Task<int> AddNumbersAsync(Uri uri, int a, int b) {     var soapString = this.ConstructSoapRequest(a, b);     using (var client = new HttpClient())     {         client.DefaultRequestHeaders.Add("SOAPAction", "http://CalculatorService/ICalculatorService/Add");         var content = new StringContent(soapString, Encoding.UTF8, "text/xml");         using (var response = await client.PostAsync(uri, content))         {             var soapResponse = await response.Content.ReadAsStringAsync();             return this.ParseSoapResponse(soapResponse);         }     } }  private string ConstructSoapRequest(int a, int b) {     return String.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>     <s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">         <s:Body>             <Add xmlns=""http://CalculatorService/"">                 <a>{0}</a>                 <b>{1}</b>             </Add>         </s:Body>     </s:Envelope>", a, b); }  private int ParseSoapResponse(string response) {     var soap = XDocument.Parse(response);     XNamespace ns = "http://CalculatorService/";     var result = soap.Descendants(ns + "AddResponse").First().Element(ns + "AddResult").Value;     return Int32.Parse(result); } 
like image 54
Nick Gotch Avatar answered Oct 11 '22 09:10

Nick Gotch