情景
在web API开发的过程中,免不了有些系统比较古老,需要支持调用webservice,并使用xml交互。
在基于MVC5或者net.core的方式实现调用webservice并不是十分友好。
一般我不建议直接采用【引用】-【添加服务引用】-【高级】-【添加web引用】 在Net Framework 自动生成的代码
比较多,并不简洁易懂,但是调用是方便很多。
下面是基于自定义SOAP请求服务
#region 构造soap请求信息 格式参考Raw 返回类型参考Raw
StringBuilder soap = new StringBuilder();
// soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.ecooperation.epicc.com.cn/\">");
soap.Append(" <soapenv:Header/>");
soap.Append(" <soapenv:Body>");
soap.Append("<web:insureService>");
soap.Append($" <interfaceNo>{InterfaceNo}</interfaceNo>");
soap.Append($" <datas><![CDATA[ {Datas} ]]></datas>");
soap.Append(" </web:insureService>");
soap.Append(" </soapenv:Body>");
soap.Append("</soapenv:Envelope>");
//_loggerHelper.Info("RenBaoInsure请求", xml, "RenBaoInsure");
bll_TGuaranteeInfo_Manual.AddLog(generalInfo.UUID, "请求", Datas, url);
//返回成功与失败的判断 失败后返回空的ReturnInfo上去
string result = GetSOAPReSource(url.Replace("?wsdl", ""), soap.ToString());
//_loggerHelper.Info("RenBaoInsure返回", WebUtility.HtmlDecode(result), "RenBaoInsure");
bll_TGuaranteeInfo_Manual.AddLog(generalInfo.UUID, "返回", WebUtility.HtmlDecode(result), url);
XmlDocument doc = new XmlDocument();
doc.LoadXml(result);
ReturnInfo returnInfo = (ReturnInfo)XmlUtil.Deserialize<ReturnInfo>(doc.InnerText);
在传递XML给对方系统前我方的XML格式参数【编码前】,对方系统接受并返回结果回来可能属于【编码后】格式。
编码前
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<ReturnInfo>
<GeneralInfoReturn>
<UUID>cxp49ec8ec93579e340b</UUID>
<PlateformCode>0726</PlateformCode>
<ErrorCode>00</ErrorCode>
<ErrorMessage>成功</ErrorMessage>
</GeneralInfoReturn>
<PolicyInfoReturns>
<PolicyInfoReturn>
<SerialNo>49</SerialNo>
<PolicyNo>Q000E01038</PolicyNo>
<PolicyUrl>http://testing.mypicc.com.cn/t/cc/VNBFv2</PolicyUrl>
<DownloadUrl><![CDATA[http://ptest.cc.com.cn/ecootion/polinload/dowl.do?platfromcodes=726&policyNo=5BC2E]]></DownloadUrl>
<SaveResult>00</SaveResult>
<SaveMessage>处理成功</SaveMessage>
<SaveTimes>2019-07-15 16:04:29</SaveTimes>
<InsuredReturns>
<InsuredReturn>
<InsuredSeqNo>1</InsuredSeqNo>
<CheckResult>00</CheckResult>
<CheckMessage>处理成功</CheckMessage>
</InsuredReturn>
</InsuredReturns>
</PolicyInfoReturn>
</PolicyInfoReturns>
</ReturnInfo>
编码后
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<ReturnInfo>
<GeneralInfoReturn>
<UUID>cxp49ec8ec93579e340b</UUID>
<PlateformCode>0726</PlateformCode>
<ErrorCode>00</ErrorCode>
<ErrorMessage>成功</ErrorMessage>
</GeneralInfoReturn>
<PolicyInfoReturns>
<PolicyInfoReturn>
<SerialNo>49</SerialNo>
<PolicyNo>Q000E01038</PolicyNo>
<PolicyUrl>http://testing.mypicc.com.cn/t/cc/VNBFv2</PolicyUrl>
<DownloadUrl><![CDATA[http://ptest.cc.com.cn/ecootion/polinload/dowl.do?platfromcodes=726&policyNo=5BC2E]]></DownloadUrl>
<SaveResult>00</SaveResult>
<SaveMessage>处理成功</SaveMessage>
<SaveTimes>2019-07-15 16:04:29</SaveTimes>
<InsuredReturns>
<InsuredReturn>
<InsuredSeqNo>1</InsuredSeqNo>
<CheckResult>00</CheckResult>
<CheckMessage>处理成功</CheckMessage>
</InsuredReturn>
</InsuredReturns>
</PolicyInfoReturn>
</PolicyInfoReturns>
</ReturnInfo>
【编码后】在C#推荐2种方式快速解码
方式一:
using System.Net;
WebUtility.HtmlDecode(“内容”)
方式二:
using System.Xml;
XmlDocument doc = new XmlDocument();
doc.LoadXml(result);
doc.InnerText;