net example consumir consume c# web-services soap httpclient

consumir - soap envelope c# example



¿Cómo puedo agregar un encabezado de autenticación SOAP con HTTPRequestMessage? (2)

Dado el OP proporcionado, la siguiente Prueba Unitaria se realizó como una prueba de concepto de cómo puede completar el encabezado del mensaje de encabezado y crear una solicitud.

[TestClass] public class SOAP_UnitTests { private HttpMethod method; private string uri; private string action; [TestMethod] public void _Add_SOAP_Auth_Header_Details_With_HttpRequestMessage() { string username = "TheUserName"; string password = "ThePassword"; var xml = ConstructSoapEnvelope(); var doc = XDocument.Parse(xml); var authHeader = doc.Descendants("{http://www.test.com/testing/Security}AuthenticationHeader").FirstOrDefault(); if (authHeader != null) { authHeader.Element(authHeader.GetDefaultNamespace() + "UserName").Value = username; authHeader.Element(authHeader.GetDefaultNamespace() + "Password").Value = password; } string envelope = doc.ToString(); var request = CreateRequest(method, uri, action, doc); request.Content = new StringContent(envelope, Encoding.UTF8, "text/xml"); //request is now ready to be sent via HttpClient //client.SendAsync(request); } private static HttpRequestMessage CreateRequest(HttpMethod method, string url, string action, XDocument soapEnvelopeXml) { var request = new HttpRequestMessage(method: method, requestUri: url); request.Headers.Add("SOAPAction", action); request.Headers.Add("ContentType", "text/xml;charset=/"utf-8/""); request.Headers.Add("Accept", "text/xml"); request.Content = new StringContent(soapEnvelopeXml.ToString(), Encoding.UTF8, "text/xml"); ; return request; } private string ConstructSoapEnvelope() { var message = @"<?xml version=''1.0'' encoding=''utf-8''?> <soap:Envelope xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xmlns:xsd=''http://www.w3.org/2001/XMLSchema'' xmlns:soap=''http://schemas.xmlsoap.org/soap/envelope/''> <soap:Header> <AuthenticationHeader xmlns=''http://www.test.com/testing/Security''> <UserName>string</UserName> <Password>string</Password> </AuthenticationHeader> </soap:Header> <soap:Body> <GetMeSomething xmlns=''http://www.test.com/testing/WorkFileCatalog''> <Param1>string</Param1> <Param2>string</Param2> <XMLRetMess>string</XMLRetMess> </GetMeSomething> </soap:Body> </soap:Envelope> "; return message; } }

Aquí está lo que se supone que debe parecer el encabezado

<soap:Header> <AuthenticationHeader> <UserName>string</UserName> <Password>string</Password> </AuthenticationHeader> </soap:Header>

Esto es lo que he intentado:

string username = "TheUserName"; string password = "ThePassword"; HttpRequestMessage requestMessage = new HttpRequestMessage(method, uri); requestMessage.Headers.Add("UserName", username); requestMessage.Headers.Add("Password", password);

Tal vez tengo que configurar de alguna manera el encabezado de autorización?

requestMessage.Headers.Authorization = ??

Siento que de alguna manera tengo que "construir" ese elemento AuthenticationHeader pero no estoy seguro de cómo hacerlo. ¿Alguna sugerencia?

Edición: Sobre SOAP completo

?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <AuthenticationHeader xmlns="http://www.test.com/testing/Security"> <UserName>string</UserName> <Password>string</Password> </AuthenticationHeader> </soap:Header> <soap:Body> <GetMeSomething xmlns="http://www.test.com/testing/WorkFileCatalog"> <Param1>string</Param1> <Param2>string</Param2> <XMLRetMess>string</XMLRetMess> </GetMeSomething> </soap:Body> </soap:Envelope>


Si está utilizando HttpClient para enviar una solicitud, debe compilar la solicitud XML completa.

En otras palabras, construiría el XML de Soap exacto incluyendo todos los elementos

string requestXml = your actual full soap xml string result = HttpClient.Post ( your actual xml )