Пример #1
0
 private static XElement GetEnvelope(SoapMessageConfiguration soapMessageConfiguration)
 {
     return(new
            XElement(
                soapMessageConfiguration.Schema + "Envelope",
                new XAttribute(
                    XNamespace.Xmlns + "soapenv",
                    soapMessageConfiguration.Schema.NamespaceName)));
 }
Пример #2
0
        /// <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));
        }
Пример #3
0
    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()));
    }