网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

.NET调用JAVA的WebServer方法

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

调用WebServer,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebServer时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料,但是都整理的不够清晰明了。根据网上的资料,个人也对各种方法进行了尝试,费了不少精力,为此特将自己的解决方法进行总结一下,以备以后需要以及相关朋友参考。

先说说的思路:
1、先用soapUI进行测试,这个工具会自己生成调用某个方法的XML。
2、把soapUI生成的XML作为模版,自己也生成一个一模一样的XML并为参数节点赋好值。
3、将这个XML通过http直接发送给WebServer。
4、接收返回的XML进行处理。


这样做最大的好处就是可以自己很轻松的控制XML格式,最开始的时候我是通过添加引用的方式去调用某个方法一直失败,但是用soapUI去测试这个方法又是可以成功调用的,折腾了半天,最后通过抓包的方式对发送的数据进行对比,发现两者发送的XML相差甚远,好了废话不说了,就拿一个小实例来演示这个过程吧。

首先,通过soapUI工具测试调用WebServer里一个名为getPopCheckedInfo的方法,生成的XML如下:

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.pop.wsif.cogent.com/"> 
  2.   <soapenv:Header> 
  3.     <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
  4.       <wsse:UsernameToken wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
  5.         <wsse:Username>用户名</wsse:Username> 
  6.         <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">密码</wsse:Password> 
  7.         <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">qTW5ajMAEp4o9BiSvcczNA==</wsse:Nonce> 
  8.         <wsu:Created>2010-05-24T07:02:10.531Z</wsu:Created> 
  9.       </wsse:UsernameToken> 
  10.     </wsse:Security> 
  11.   </soapenv:Header> 
  12.   <soapenv:Body> 
  13.     <ws:getPopCheckedInfo> 
  14.       <arg0>参数</arg0> 
  15.     </ws:getPopCheckedInfo> 
  16.   </soapenv:Body> 
  17. </soapenv:Envelope> 

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

下面看看调用的代码实现吧:(为了理解方便清晰,我们用跟WenServer上一模一样的方法名和参数)

  1. /// <summary> 
  2. /// 根据居民id获取该居民信息 
  3. /// </summary> 
  4. /// <param name="id">居民id</param> 
  5. public static People getPopCheckedInfo(string id) 
  6.     String ServerUrl = Config.GetWebServerURL();//得到WebServer地址 
  7.     Hashtable pars = new Hashtable();//用来存放参数 
  8.     pars["arg0"] = id; 
  9.     XmlDocument xml = WebSvcCaller.QuerySoapWebService(ServerUrl, "getPopCheckedInfo", pars); 
  10.     //这个是对返回的XML文件处理,我删掉了,处理完后返回一个居民的实体对象 
  11.     return myPeople; 

WebSvcCaller.QuerySoapWebService方法代码:

  1. /// <summary> 
  2. /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值 
  3. /// </summary> 
  4. public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars) 
  5.     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); 
  6.     request.Method = "POST"
  7.     request.Accept = @"gzip,deflate"
  8.     request.ContentType = @"text/xml;charset=utf-8"
  9.     request.UserAgent = @"Jakarta Commons-HttpClient/3.1"
  10.     request.Credentials = CredentialCache.DefaultCredentials; 
  11.     request.Timeout = 10000; 
  12.     byte data = EncodeParsToSoap(Pars, MethodName); 
  13.     WriteRequestData(request, data);//将处理成字节组的XML写到流中发送到服务端 
  14.     XmlDocument doc = new XmlDocument(); 
  15.     doc = ReadXmlResponse(request.GetResponse());//读取服务端返回的结果 
  16.     return doc; 

EncodeParsToSoap(Pars, MethodName),处理XML文件方法的代码:(以下仅供参考,大家根据自己的实际情况变动)

  1. /// <summary> 
  2. /// 处理要发送的XML文档 
  3. /// </summary> 
  4. /// <param name="Pars">参数</param> 
  5. /// <param name="MethodName">方法名</param> 
  6. private static byte EncodeParsToSoap(Hashtable Pars, String MethodName) 
  7.     XmlDocument xml = null
  8.     if (hshtableXML.ContainsKey(MethodName)) 
  9.     {//如果已经加载过,则从缓存中读取 
  10.         xml = (XmlDocument)hshtableXML[MethodName]; 
  11.     } 
  12.     else 
  13.     {//如果还未加载则进行加载,并放入缓存 
  14.  
  15.         //从资源文件得到文件流 
  16.         Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("你的项目的名称.XML文件存放的文件夹." + MethodName + ".xml"); 
  17.         xml = new XmlDocument(); 
  18.         xml.Load(stream); 
  19.         hshtableXML.Add(MethodName, xml); 
  20.     } 
  21.  
  22.     //修改参数的值 
  23.     foreach (DictionaryEntry de in Pars) 
  24.     { 
  25.         XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable); 
  26.         nsmgr.AddNamespace("soapenv""http://schemas.xmlsoap.org/soap/envelope/"); 
  27.         nsmgr.AddNamespace("ws""http://ws.pop.wsif.cogent.com/"); 
  28.         Hashtable subpars = de.Value as Hashtable; 
  29.         if (subpars == null
  30.         { 
  31.             string subNode = "soapenv:Envelope/soapenv:Body/ws:" + MethodName + "/" + de.Key.ToString(); 
  32.             XmlNode node = xml.SelectSingleNode(subNode, nsmgr); 
  33.             node.InnerText = de.Value.ToString(); 
  34.         } 
  35.         else 
  36.         { 
  37.             foreach (DictionaryEntry subde in subpars) 
  38.             { 
  39.                 string subNode = "soapenv:Envelope/soapenv:Body/ws:" + MethodName + "/" + de.Key.ToString() + "/" + subde.Key.ToString(); 
  40.                 XmlNode node = xml.SelectSingleNode(subNode, nsmgr); 
  41.                 node.InnerText = subde.Value.ToString(); 
  42.             } 
  43.         } 
  44.         
  45.     } 
  46.  
  47.     //将修改后的XML文件保存到流中 
  48.       //这样做还可以保证发送的XML文件也是格式化的那种形式,而不是一整行 
  49.       //如通过OuterXml获取的就是一整行,这样也可能会导致服务端解析失败,个人这次就碰到这种情况了 
  50.     MemoryStream outStream = new MemoryStream(); 
  51.     xml.Save(outStream); 
  52.  
  53.     byte buffer = new byte[outStream.Length]; 
  54.     byte temp = outStream.GetBuffer(); 
  55.     for (int i = 0; i < buffer.Length; i++) 
  56.     { 
  57.         buffer[i] = temp[i]; 
  58.     } 
  59.     outStream.Close(); 
  60.  
  61.     return buffer; 

最后还有WriteRequestData、ReadXmlResponse两个方法的代码:

  1. /// <summary> 
  2. /// 写到流中,发送给服务端 
  3. /// </summary> 
  4. /// <param name="request">HttpWebRequest连接对象</param> 
  5. /// <param name="data">要写入连接流发给服务端的内容</param> 
  6. private static void WriteRequestData(HttpWebRequest request, byte data) 
  7.     request.ContentLength = data.Length; 
  8.     Stream writer = request.GetRequestStream(); 
  9.     writer.Write(data, 0, data.Length); 
  10.     writer.Close(); 
  11.  
  12. /// <summary> 
  13. /// 读取服务端返回的结果 
  14. /// </summary> 
  15. private static XmlDocument ReadXmlResponse(WebResponse response) 
  16.     StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
  17.     String retXml = sr.ReadToEnd(); 
  18.     sr.Close(); 
  19.     XmlDocument doc = new XmlDocument(); 
  20.     doc.LoadXml(retXml); 
  21.     return doc; 

注明:本文方法部分实现参考了网上几篇相关文章方法和思路,因为一下已经找不到原文的地址,在此向原作者表示歉意,以后找到会补上。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师