【问题标题】:how to implement soap receiver for saop envelope message c#如何为soap信封消息c#实现soap接收器
【发布时间】:2017-11-22 18:26:10
【问题描述】:

如何为saop信封消息实现soap接收器c# 我正在将我的应用程序与旧系统集成,该系统应该响应我的系统作为回调响应。 我的网络服务应该会收到这条肥皂消息

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
   <soapenv:Header> 
      <ns1:NotifySOAPHeader xmlns:ns1="http://www.huawei.com.cn/schema/common/v2_1"> 
         <ns1:traceUniqueID>504021505821207281129180006002</ns1:traceUniqueID> 
      </ns1:NotifySOAPHeader> 
   </soapenv:Header> 
   <soapenv:Body> 
      <ns2:processRequest xmlns:ns2="http://b2b.mobilemoney.mtn.zm_v1.0/"> 
         <serviceId>101</serviceId> 
         <parameter> 
            <name>ProcessingNumber</name> 
            <value>12121212</value> 
         </parameter> 
         <parameter> 
            <name>senderID</name> 
            <value>MOM</value> 
         </parameter> 
         <parameter> 
            <name>AcctRef</name> 
            <value>112233</value> 
         </parameter> 
         <parameter> 
            <name>RequestAmount</name> 
            <value>1212</value> 
         </parameter> 
         <parameter> 
            <name>paymentRef</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>ThirdPartyTransactionID</name> 
            <value>12112</value> 
         </parameter> 
         <parameter> 
            <name>MOMAcctNum</name> 
            <value>121212</value> 
         </parameter> 
         <parameter> 
            <name>CustName</name> 
            <value>121212</value> 
         </parameter> 
         <parameter> 
            <name>TXNType</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>StatusCode</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>OpCoID</name> 
            <value>0</value> 
         </parameter> 
      </ns2:processRequest> 
   </soapenv:Body> 
</soapenv:Envelope>

如何构建接受此肥皂消息的网络服务

【问题讨论】:

  • “web-service”是一个模糊的术语,你的“服务”到底是什么? BRAHIM 的答案可能在正确的轨道上,但没有理由进行任何字符串操作。此外,如果服务公开了它的元数据,您可以尝试将服务引用添加到您的项目中,它会完成所有艰苦的工作 - 但不清楚哪个服务正在调用谁。
  • @Crowcoder 我正在做一个字符串操作只是为了省略命名空间操作的问题,我认为在性能方面比在 xml 元素上这样做要好得多
  • @BRAHIMKamel,这就是XNamespace 的用途。如果你不能依赖它是一致的,你总是可以使用XName.LocalName
  • @BRAHIMKamel 我非常不同意一堆索引和子字符串和Replace 是 KISS,xml 有丰富的 api 和 IMO 应该使用它。此外,这是 xml,而不是 JSON。

标签: c# asp.net web soap service


【解决方案1】:

你可以试试下面的

  • 将回调声明为 post http 方法
  • 获取您的请求正文并将其反序列化为 POO

在你的控制器中

  [HttpPost]
        Public async Task<IHttpActionResult> ProcessRequest(string saopRequest)
        {   //here just a bit of string manipulation 
           var index = soapRequest.IndexOf("<ns2:processRequest");
                var lasindex = soapRequest.IndexOf("</ns2:processRequest>");
                var length = lasindex - index +"</ns2:processRequest>".Length  ;           
                var body = soapRequest.Substring(index,length);
                var request = body.Replace("ns2:", string.Empty).Replace("xmlns:ns2=\"http://b2b.mobilemoney.mtn.zm_v1.0/\"",string.Empty);

                XDocument xResult = XDocument.Parse(request);


                XmlSerializer deserializer = new XmlSerializer(typeof(ProcessRequest), new XmlRootAttribute("processRequest"));
                if (xResult.Root != null)
                {
                    var finalRequest= (ProcessRequest)deserializer.Deserialize(xResult.Root.CreateReader());
                    //do what you  want here 
                }                
        }



        [XmlRoot(ElementName="parameter")]
        public class Parameter {
            [XmlElement(ElementName="name")]
            public string Name { get; set; }
            [XmlElement(ElementName="value")]
            public string Value { get; set; }
        }

        [XmlRoot(ElementName="processRequest")]
        public class ProcessRequest {
            [XmlElement(ElementName="serviceId")]
            public string ServiceId { get; set; }
            [XmlElement(ElementName="parameter")]
            public List<Parameter> Parameter { get; set; }      
        }
}

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多