如何为 SAOP 信封消息 C# 实现 SOAP 接收器我正在将我的应用程序与旧系统集成,旧系统应该响应我的系统作为回调响应。我的 Web 服务应收到此 SOAP 消息
<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>
如何构建接受此 SOAP 消息的 Web 服务
您可以尝试以下操作
- 将回调声明为后 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; }
}
}