推荐使用.net调用java编写的webservice方法

上传人:第*** 文档编号:31143301 上传时间:2018-02-05 格式:DOC 页数:6 大小:69.50KB
返回 下载 相关 举报
推荐使用.net调用java编写的webservice方法_第1页
第1页 / 共6页
推荐使用.net调用java编写的webservice方法_第2页
第2页 / 共6页
推荐使用.net调用java编写的webservice方法_第3页
第3页 / 共6页
推荐使用.net调用java编写的webservice方法_第4页
第4页 / 共6页
推荐使用.net调用java编写的webservice方法_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《推荐使用.net调用java编写的webservice方法》由会员分享,可在线阅读,更多相关《推荐使用.net调用java编写的webservice方法(6页珍藏版)》请在金锄头文库上搜索。

1、推荐使用.NET 调用 java 编写的 WebService 方法如果.NET 调用 WebService,最简单的办法当然是直接添加 WEB 引用,然后自动产生代理类,但是在调用 JAVA 的 WebService 时并没有这么简单,特别是对于SoapHeader 的处理。先说说的思路:1、先用 soapUI 进行测试,这个工具会自动生成调用某个方法的 XML。2、把 soapUI 生成的 XML 作为模版,自己也生成一个一模一样的 XML 并为参数节点赋好值。3、将这个 XML 通过 http 直接发送给 WebService。4、接收返回的 XML 进行处理。这样做最大的好处就是可以自

2、己很轻松的控制 XML 格式,最开始的时候我是通过添加引用的方式去调用某个方法一直失败,但是用 soapUI 去测试这个方法又是可以成功调用的,折腾了半天,最后通过抓包的方式对发送的数据进行对比,发现两者发送的 XML 相差甚远,好了废话不说了,就拿一个小实例来演示这个过程吧。首先,通过 soapUI 工具测试调用 WebService 里一个名为 getPopCheckedInfo的方法,生成的 XML 如下:soapUI 生成的 XML http:/用户名密码qTW5ajMAEp4o9BiSvcczNA=2010-05-24T07:02:10.531Z 参数上面三个用汉字标示的地方就是我们

3、要修改赋值的地方,大家看到了吧,如果用添加引用自动生成代理类的方式,要产生这样格式的 XML 有多难控制了吧,但是如果全部用代码来生成也不是一件容易的事,个人用了一个比较巧妙的办法:在项目中添加一个名为“getPopCheckedInfo”的 xml 文件,将上面的 XML 粘贴上去,然后再将这个 XML 文件作为内嵌资源(在这个的文件属性里面的生产操作选择 嵌入的资源),使用的时候直接加载这个 XML 文件,然后修改那 3 个节点的值就可以了(用户名和密码一般都预先确定的,也可以直接写在 XML 文件里,调用的时候就只要对那一个参数赋值了)。使用内嵌资源是为了不让外面看到我们的那个 XML

4、文件,以防被修改了什么的。下面看看调用的代码实现吧:(为了理解方便清晰,我们用跟 WebService 上一模一样的方法名和参数)Code http:/ / 根据居民 id 获取该居民信息/ / 居民 idpublic static People getPopCheckedInfo(string id)String ServerUrl = Config.GetWebServerURL();/得到WebServer 地址Hashtable pars = new Hashtable();/用来存放参数parsarg0 = id;XmlDocument xml = WebSvcCaller.Quer

5、ySoapWebService(ServerUrl, getPopCheckedInfo, pars);/这个是对返回的 XML 文件处理,我删掉了,处理完后返回一个居民的实体对象return myPeople;WebSvcCaller.QuerySoapWebService 方法代码:Code http:/ / / 通用 WebService 调用(Soap),参数 Pars 为 String 类型的参数名、参数值/ public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable P

6、ars)HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);request.Method = POST;request.Accept = gzip,deflate;request.ContentType = text/xml;charset=utf-8;request.UserAgent = Jakarta Commons-HttpClient/3.1;request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000

7、;byte data = EncodeParsToSoap(Pars, MethodName);WriteRequestData(request, data);/将处理成字节组的 XML 写到流中发送到服务端XmlDocument doc = new XmlDocument();doc = ReadXmlResponse(request.GetResponse();/读取服务端返回的结果return doc;EncodeParsToSoap(Pars, MethodName),处理 XML 文件方法的代码:(以下仅供参考,大家根据自己的实际情况变动)处理 XML 文件方法的代码 http:/

8、/ 处理要发送的 XML 文档/ / 参数/ 方法名private static byte EncodeParsToSoap(Hashtable Pars, String MethodName)XmlDocument xml = null;if (hshtableXML.ContainsKey(MethodName)/如果已经加载过,则从缓存中读取xml = (XmlDocument)hshtableXMLMethodName;else/如果还未加载则进行加载,并放入缓存/从资源文件得到文件流 Stream stream = Assembly.GetExecutingAssembly().Ge

9、tManifestResourceStream(你的项目的名称.XML 文件存放的文件夹. MethodName .xml);xml = new XmlDocument();xml.Load(stream);hshtableXML.Add(MethodName, xml);/修改参数的值foreach (DictionaryEntry de in Pars)XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);nsmgr.AddNamespace(soapenv, http:/schemas.xmlsoap.org

10、/soap/envelope/);nsmgr.AddNamespace(ws, http:/ subpars = de.Value as Hashtable;if (subpars = null)string subNode = soapenv:Envelope/soapenv:Body/ws: MethodName / de.Key.ToString();XmlNode node = xml.SelectSingleNode(subNode, nsmgr);node.InnerText = de.Value.ToString();elseforeach (DictionaryEntry su

11、bde in subpars)string subNode = soapenv:Envelope/soapenv:Body/ws: MethodName / de.Key.ToString() / subde.Key.ToString();XmlNode node = xml.SelectSingleNode(subNode, nsmgr);node.InnerText = subde.Value.ToString();/将修改后的 XML 文件保存到流中 /这样做还可以保证发送的 XML 文件也是格式化的那种形式,而不是一整行/如通过 OuterXml 获取的就是一整行,这样也可能会导致服务

12、端解析失败,个人这次就碰到这种情况了MemoryStream outStream = new MemoryStream();xml.Save(outStream);byte buffer = new byteoutStream.Length;byte temp = outStream.GetBuffer();for (int i = 0; i / 写到流中,发送给服务端/ / HttpWebRequest 连接对象/ 要写入连接流发给服务端的内容private static void WriteRequestData(HttpWebRequest request, byte data)requ

13、est.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();/ / 读取服务端返回的结果/ private static XmlDocument ReadXmlResponse(WebResponse response)StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close(); XmlDocument doc = new XmlDocument();doc.LoadXml(retXml);return doc;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号