使用C#的SOAP客户端

如何解决使用C#的SOAP客户端

我有Soap Web服务https://test-submit.health263.systems:8081/apacewebservices/AMF1_0?wsdl。此方法称为进程。我的问题是我如何创建肥皂客户端来发送请求,该请求从服务器提交/检索信息。请求的示例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信封和标头部分

解决方法

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

我能够访问您的Web服务,但出现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,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();
            }
        }
    }
}

,

您有两个选择

  1. 添加为服务参考,将会生成
    add as a service reference
  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。通用列表`1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-