这次天津朗新的接口把原来浙江南网的WEBSERVER进行了升级,由于对方采用的是AXIS开发的服务,所以对方所给的例程是JAVA的例程,而对别的语言所做接口则没有说明。从网上看了很多朋友提出类似的问题,都没有正确答案,我也在网上查找了很多资料,又到AXIS的官网上的查了下,都没什么大的收获,直到无意中看到两篇文章:一个是把NET整合进其它平台,一个是SOAP的三种使用方法(同济黄正http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2008320/105904.html)这两种方法给我很大启示,我于是整理了一下思路,把这两种文字内容整合了一个动态库文件,在天津项目中调试成功。其主要思想是:
1、自己按照服务要求载入XML文件到SOAPHEADER中。
XmlDocument doc = new XmlDocument();
xmlHeader:即为你所要求的SOAPHEADER的样式,可以用STRING直接组成,也可以由STRINGBUILDER的自由组合。然后转成STRING即可。
AddDelaration(doc);
XmlElement soapBody = doc.CreateElement("soapenv", "Body",
"http://schemas.xmlsoap.org/soap/envelope/");
XmlElement soapMethod = doc.CreateElement(MethodName);
soapMethod.SetAttribute("xmlns", XmlNs);
foreach (string k in Pars.Keys)
{
//xsi:type="xsd:string"
XmlElement soapPar = doc.CreateElement(k);
soapPar.SetAttribute("xsi:type", "xsd:string");
soapPar.InnerText = Pars[k].ToString();
soapMethod.AppendChild(soapPar);
}
注意:上面用哈希表插入参数,总是报错,后来发现,哈希表会自动排序,造成参数顺序错误,无法识别程序的内容。所以做为测试,直接改成了下面的样子,成功。
string test = "<?xml
version="1.0"?>
N="APP_NO">200810119759
N="METER_ID">11607030
N="TEST_RSLT">1
";XmlElement soapPar = doc.CreateElement("path");
soapPar.SetAttribute("xsi:type", "xsd:string");
soapPar.InnerText =
"epm/mp/sitechk/service/LocaleCheckResultLoadService";
soapMethod.AppendChild(soapPar);
soapPar = doc.CreateElement("methodName");
soapPar.SetAttribute("xsi:type", "xsd:string");
soapPar.InnerText = "setMeterSitechk";//"GET_METER_SITECHK";
soapMethod.AppendChild(soapPar);
soapPar = doc.CreateElement("dataXmlStr");
soapPar.SetAttribute("xsi:type", "xsd:string");
soapPar.InnerText = test;
soapMethod.AppendChild(soapPar);
soapBody.AppendChild(soapMethod);
doc.DocumentElement.AppendChild(soapBody);
return Encoding.UTF8.GetBytes(doc.OuterXml);
2、利用上述文中提到的HTTPWEBREQUEST和WebResponse发送和接收消息。
WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(),
Encoding.UTF8);
XmlDocument doc = new XmlDocument();
doc.LoadXml(sr.ReadToEnd());
return doc.SelectSingleNode("//@targetNamespace").Value;
3、注意,在朗新的接口中对参数的顺序是有要求的,所以一定要记得把参数顺序整理好,否则会得到错误结果。
这个程序这样写有一个很大的优点不是可以任意的组合SOAP达到跨超平台的使用,这里再次感谢上述两篇文章的作者,如果没有你们的启发,我无法顺利的完成这个项目。
如果有朋友需要这个DLL,可以与我联系,我会把库文件和如何使用的方法告诉大家。我的联系方式:
fpcfjf@126.com