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 ...
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.
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.
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.
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.
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); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With