【问题标题】:SOAP Client using C#使用 C# 的 SOAP 客户端
【发布时间】:2020-09-01 00:43:04
【问题描述】:

我有 Soap 网络服务https://test-submit.health263.systems:8081/apacewebservices/AMF1_0?wsdl。这有一个名为process的方法。我的问题是如何创建soap客户端来发送请求,从服务器提交/检索信息。请求的示例 XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Member xmlns="urn:apace:member:format:1.0">
  <Request>
    <Transaction>
      <VersionNumber>1.0</VersionNumber>
      <Number>434252-342234-6765</Number>
      <SystemIdentifier>SYSTEM999</SystemIdentifier>
      <DestinationCode>APACE</DestinationCode>
      <ClientCountryCode>ZA</ClientCountryCode>
      <Timestamp TimeZone="Africa/Johannesburg">20160601123456</Timestamp>
      <TestIndicator>Y</TestIndicator>
      <User>ProviderX/Jane Doe</User>
    </Transaction>
    <MembershipLookup>
      <Funder>AFunder</Funder>
      <WithMembershipNumber>
        <MembershipNumber>123456789</MembershipNumber>
      </WithMembershipNumber>
    </MembershipLookup>
  </Request>
</Member>

响应消息的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<Member xmlns="urn:apace:member:format:1.0">
  <Response>
    <Transaction>
      <VersionNumber>1.0</VersionNumber>
      <Number>434252-342234-6765</Number>
      <Status>S</Status>
      <Timestamp TimeZone="Africa/Johannesburg">20160601123500</Timestamp>
    </Transaction>
    <Membership NumberOfBeneficiaryRecords="2">
      <Funder>AFunder</Funder>
      <MembershipNumber>123456789</MembershipNumber>
      <Beneficiary SequenceNumber="1">
        <DependentCode>00</DependentCode>
        <Type>P</Type>
        <Status>A</Status>
        <BiometricEnrolmentStatus>Y</BiometricEnrolmentStatus>
      </Beneficiary>
      <Beneficiary SequenceNumber="2">
        <DependentCode>01</DependentCode>
        <Type>D</Type>
        <Status>A</Status>
        <BiometricEnrolmentStatus>Y</BiometricEnrolmentStatus>
      </Beneficiary>
    </Membership>
  </Response>
</Member>

请帮助我真的卡住了,没有使用 C# 的 SOAP 服务,我在网上尝试过示例但结构不符合我的消息结构更复杂

实际的消息结构如下:

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:apac="http://apace.systems/apacewebservices/"
    xmlns:urn="urn:apace:member:format:1.1">
    <soap:Header>
        <apac:secureToken>Token66657752</apac:secureToken>
    </soap:Header>
    <soap:Body>
        <apac:process>
            <apac:request>
                <Member
                    xmlns="urn:apace:member:format:1.1">
                    <Request>
                        <Transaction>
                            <VersionNumber>1.1</VersionNumber>
                            <Number>30074</Number>
                            <SystemIdentifier>LIFEHEALTH</SystemIdentifier>
                            <DestinationCode>HEALTH263</DestinationCode>
                            <ClientCountryCode>ZA</ClientCountryCode>
                            <Timestamp TimeZone="Africa/Johannesburg">20200705123456</Timestamp>
                            <TestIndicator>Y</TestIndicator>
                            <User>CIMSZW/Jane Doe</User>
                        </Transaction>
                        <MembershipLookup>
                            <IncludeDetail>Y</IncludeDetail>
                            <Funder>CIMSZWA</Funder>
                            <WithMembershipNumber>
                                <MembershipNumber>11117374</MembershipNumber>
                                <DependentCode>00</DependentCode>
                            </WithMembershipNumber>
                        </MembershipLookup>
                    </Request>
                </Member>
            </apac:request>
        </apac:process>
    </soap:Body>
</soap:Envelope>

如何使用安全密钥令牌创建 SOAP 信封和标头部分

【问题讨论】:

  • 从这里开始Tutorial: Create a Windows Communication Foundation client。在某些时候似乎需要secureToken,因此请参考您必须提供的任何文件。 Hth.
  • 可以说使用 WCF 比使用底层原始 SOAP XML 更容易
  • @MickyD 如何实现它我的挑战是如何将值从我自己的系统传递到 API,如果它是创建类的代理,则这些类根本不会改变 XML 结构.

标签: c# soap request httpwebrequest httpwebresponse


【解决方案1】:

您可以使用几个不同的系统库来创建 HttpWebRequest,创建自定义 xml,然后在发送之前将该 xml 插入到您的请求中。 (system.net, system.xml.linq, system.io)

我能够访问您的网络服务,但收到 500 错误。 (希望你能看到一个日志,或者那不是你的!)

这是一个可以调用 SOAP Web 服务的简单类。它几乎是您需要的 xml,但可能需要一些调整。如果您在制作自定义 xml 时遇到问题,这可能是一个可能的解决方案。

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml.Linq;

namespace ConsoleApp1
{
    /// <summary>
    /// Random class
    /// </summary>
    class Class1
    {
        /// <summary>
        /// Function that calls a SOAP web service
        /// </summary>
        public void CallSOAP()
        {
            try
            {
                // Construct http post request
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("https://test-submit.health263.systems:8081/apacewebservices/AMF1_0"));
                request.Method = "POST";
                request.ContentType = "application/xml";
                request.Accept = "application/xml";

                // Setting a namespace for your xml
                // I'm not sure the timezone one is set up properly
                XNamespace soap = "urn:apace:member:format:1.0";
                XNamespace timezone = "TimeZone=\"Africa/Johannesburg\"";

                // This constructs your xml using the LINQ library. I modeled after your demo, but needs tweaking as I get 500 error from server.
                XElement requestXML =
                    new XElement(soap + "Member",
                        new XElement("Request",
                            new XElement("Transaction",
                                new XElement("VersionNumber", "1.0"),
                                new XElement("Number", "434252 - 342234 - 6765"),
                                new XElement("SystemIdentifier", "SYSTEM999"),
                                new XElement("DestinationCode", "APACE"),
                                new XElement("ClientCountryCode", "ZA"),
                                new XElement(timezone + "Timestamp", "20160601123456"),
                                new XElement("TestIndicator", "Y"),
                                new XElement("User", "ProviderX/Jane Doe")
                            ),
                            new XElement("MembershipLookup",
                                new XElement("Funder", "AFunder"),
                                new XElement("WithMembershipNumber",
                                    new XElement("MembershipNumber", 123456789)
                                )
                            )
                        )
                    );

                // Convert the xml into a stream that we write to our request
                byte[] bytes = Encoding.UTF8.GetBytes(requestXML.ToString());
                request.ContentLength = bytes.Length;
                using (Stream putStream = request.GetRequestStream())
                {
                    putStream.Write(bytes, 0, bytes.Length);
                }

                // Execute the request and get an xml response "reader". You can read all xml at once or line by line
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {

                    var streamData = reader.ReadToEnd();

                }
            }
            catch (Exception ex)
            {
                // Write exception to console & wait for key press
                Console.WriteLine(ex.Message + ex.StackTrace);
                Console.ReadKey();
            }
        }
    }
}

【讨论】:

  • 感谢代码示例我正在尝试您的解决方案
  • 我一直在测试你的答案似乎与我要找的很接近,但是请求的结构应该如下:~~~~
  • 太棒了,很高兴听到!
【解决方案2】:

你有两个选择

  1. 添加为服务参考,它将生成
  1. 使用 Visual Studio 开发人员提示并使用代理类使用服务

svcutil.exe https://test-submit.health263.systems:8081/apacewebservices/AMF1_0?wsdl /t:code /n:*,SampleNamespace /o:C:\Service\sampleServiceProxy.cs /config:C:\Service\sampleService.config /ct:System.Collections.Generic。列表`1

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多