推荐使用.NET调用java编写的WebService方法.doc_第1页
推荐使用.NET调用java编写的WebService方法.doc_第2页
推荐使用.NET调用java编写的WebService方法.doc_第3页
推荐使用.NET调用java编写的WebService方法.doc_第4页
推荐使用.NET调用java编写的WebService方法.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

推荐使用.NET调用java编写的WebService方法如果.NET调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理。先说说的思路:1、先用soapUI进行测试,这个工具会自动生成调用某个方法的XML。2、把soapUI生成的XML作为模版,自己也生成一个一模一样的XML并为参数节点赋好值。3、将这个XML通过http直接发送给WebService。4、接收返回的XML进行处理。这样做最大的好处就是可以自己很轻松的控制XML格式,最开始的时候我是通过添加引用的方式去调用某个方法一直失败,但是用soapUI去测试这个方法又是可以成功调用的,折腾了半天,最后通过抓包的方式对发送的数据进行对比,发现两者发送的XML相差甚远,好了废话不说了,就拿一个小实例来演示这个过程吧。首先,通过soapUI工具测试调用WebService里一个名为getPopCheckedInfo的方法,生成的XML如下:soapUI生成的XML 用户名 密码 qTW5ajMAEp4o9BiSvcczNA= 2010-05-24T07:02:10.531Z 参数 上面三个用汉字标示的地方就是我们要修改赋值的地方,大家看到了吧,如果用添加引用自动生成代理类的方式,要产生这样格式的XML有多难控制了吧,但是如果全部用代码来生成也不是一件容易的事,个人用了一个比较巧妙的办法:在项目中添加一个名为“getPopCheckedInfo”的xml文件,将上面的XML粘贴上去,然后再将这个XML文件作为内嵌资源(在这个的文件属性里面的生产操作选择嵌入的资源),使用的时候直接加载这个XML文件,然后修改那3个节点的值就可以了(用户名和密码一般都预先确定的,也可以直接写在XML文件里,调用的时候就只要对那一个参数赋值了)。使用内嵌资源是为了不让外面看到我们的那个XML文件,以防被修改了什么的。下面看看调用的代码实现吧:(为了理解方便清晰,我们用跟WebService上一模一样的方法名和参数)Code / / 根据居民id获取该居民信息 / / 居民id public static People getPopCheckedInfo(string id) String ServerUrl = Config.GetWebServerURL();/得到WebServer地址 Hashtable pars = new Hashtable();/用来存放参数 parsarg0 = id; XmlDocument xml = WebSvcCaller.QuerySoapWebService(ServerUrl, getPopCheckedInfo, pars); /这个是对返回的XML文件处理,我删掉了,处理完后返回一个居民的实体对象 return myPeople; WebSvcCaller.QuerySoapWebService方法代码:Code / / 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值 / public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars) 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; byte data = EncodeParsToSoap(Pars, MethodName); WriteRequestData(request, data);/将处理成字节组的XML写到流中发送到服务端 XmlDocument doc = new XmlDocument(); doc = ReadXmlResponse(request.GetResponse();/读取服务端返回的结果 return doc; EncodeParsToSoap(Pars,MethodName),处理XML文件方法的代码:(以下仅供参考,大家根据自己的实际情况变动)处理XML文件方法的代码 / / 处理要发送的XML文档 / / 参数 / 方法名 private static byte EncodeParsToSoap(Hashtable Pars, String MethodName) XmlDocument xml = null; if (hshtableXML.ContainsKey(MethodName) /如果已经加载过,则从缓存中读取 xml = (XmlDocument)hshtableXMLMethodName; else /如果还未加载则进行加载,并放入缓存 /从资源文件得到文件流 Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(你的项目的名称.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, /soap/envelope/); nsmgr.AddNamespace(ws, /); Hashtable 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(); else foreach (DictionaryEntry subde 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获取的就是一整行,这样也可能会导致服务端解析失败,个人这次就碰到这种情况了 MemoryStream outStream = new MemoryStream(); xml.Save(outStream); byte buffer = new byteoutStream.Length; byte temp = outStream.GetBuffer(); for (int i = 0; i buffer.Length; i ) bufferi = tempi; outStream.Close(); return buffer; 最后还有WriteRequestData、ReadXmlResponse两个方法的代码:Code / / 写到流中,发送给服务端 / / HttpWebRequest连接对象 / 要写入连接流发给服务端的内容 private static void WriteRequestData(HttpWebRequest request, byte data) request.ContentLength = data.Length; Stream writer = request.GetRequestStream(); writer.Write(data, 0, data.Length); writer.Close(); / / 读取服务端返回的结果 / private static XmlDocument ReadXmlResponse(WebResp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论