private static XElement GetEnvelope(SoapMessageConfiguration soapMessageConfiguration) { return(new XElement( soapMessageConfiguration.Schema + "Envelope", new XAttribute( XNamespace.Xmlns + "soapenv", soapMessageConfiguration.Schema.NamespaceName))); }
/// <inheritdoc /> public Task <HttpResponseMessage> PostAsync( Uri endpoint, SoapVersion soapVersion, IEnumerable <XElement> bodies, IEnumerable <XElement> headers = null, string action = null, CancellationToken cancellationToken = default(CancellationToken)) { if (endpoint == null) { throw new ArgumentNullException(nameof(endpoint)); } if (bodies == null) { throw new ArgumentNullException(nameof(bodies)); } if (!bodies.Any()) { throw new ArgumentException("Bodies element cannot be empty", nameof(bodies)); } // Get configuration based on version var messageConfiguration = new SoapMessageConfiguration(soapVersion); // Get the envelope var envelope = GetEnvelope(messageConfiguration); // Add headers if (headers != null && headers.Any()) { envelope.Add(new XElement(messageConfiguration.Schema + "Header", headers)); } // Add bodies envelope.Add(new XElement(messageConfiguration.Schema + "Body", bodies)); // Get HTTP content var content = new StringContent(envelope.ToString(), Encoding.UTF8, messageConfiguration.MediaType); // Add SOAP action if any if (action != null) { content.Headers.Add("SOAPAction", action); if (messageConfiguration.SoapVersion == SoapVersion.Soap12) { content.Headers.ContentType.Parameters.Add( new NameValueHeaderValue("ActionParameter", $"\"{action}\"")); } } // Execute call return(_httpClient.PostAsync(endpoint, content, cancellationToken)); }
public async void PostAsyncTests( Uri endpoint, SoapVersion version, IEnumerable <XElement> bodies, IEnumerable <XElement> headers, string action) { // Setup var testFactory = new TestHttpClientFactory(); var sut = new SoapClient(testFactory); // Exercise var result = await sut.PostAsync(endpoint, version, bodies, headers, action); // Verify outcome var actual = testFactory.Handler.CallStack.Single(); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal(endpoint, actual.Uri); // Assert action and version var actualHeaders = actual.Headers; if (actualHeaders.Contains("ActionHeader")) { var actualVersion = SoapVersion.Soap11; Assert.Equal(version, actualVersion); Assert.Equal(action, actualHeaders.GetValues("ActionHeader").Single()); } else { var actionParam = actualHeaders.ContentType?.Parameters?.SingleOrDefault(e => e.Name == "ActionParameter"); if (actionParam != null) { var actualVersion = SoapVersion.Soap12; Assert.Equal(version, actualVersion); Assert.Equal($"\"{action}\"", actionParam.Value); } } // Assert namespace var actualEnvelope = XElement.Parse(actual.Body); var expectedNamespace = new SoapMessageConfiguration(version).Schema; Assert.Equal("Envelope", actualEnvelope.Name.LocalName); Assert.Equal(expectedNamespace, actualEnvelope.Name.Namespace.NamespaceName); // Assert Headers if (headers != null && headers.Any()) { var actualHeader = actualEnvelope.Elements() .Where(e => e.Name.LocalName == "Header") .Where(e => e.Name.Namespace.NamespaceName == expectedNamespace) .Single(); Assert.Equal( headers.Select(e => e.ToString()), actualHeader.Elements().Select(e => e.ToString())); } // Assert Bodies var actualBody = actualEnvelope.Elements() .Where(e => e.Name.LocalName == "Body") .Where(e => e.Name.Namespace.NamespaceName == expectedNamespace) .Single(); Assert.Equal( bodies.Select(e => e.ToString()), actualBody.Elements().Select(e => e.ToString())); }