• .NET与Java的Web Services相互调用(转)


    :简介  
     
      本文介绍了Java.NET开发的Web   Services相互调用的技术。本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web   Services,第二部分介绍了如何用Java做客户端调用.NET开发的Web   Services  
       
     
    :项目需要的工具  
     
      Windows2000   Server(IIS)  
     
      Jbuilder9.0(   含有Tomcat   ,   axis)  
     
      JDK1.4+Java   Web   Services   Develop  
     
      VS.Net   2003  
     
      备注:如果没有JBuilder的话就需要自己下载安装Tomcat4.1   以及   Axis的开发包,并做相应配置。由于网上有很多这样的文章,这里就不一一说明了。  
       
     
    :.NET做客户端调用Java写的Web   Services  
       
     
      1.   生成一个Java   Web   Services  
     
      使用JBuilder   生成一个Web   Services是非常简单的,我完全是按照它的帮助做的,只要一步步做下去就可以了。具体路径是Developing   Web   Services   ->   tutorials   :   Web   Services(Axis)   ->   Creating   a   simple   Web   Services  
       
     
      2.   发布这个Web   Services并得到它的WSDL  
     
      Web   Services生成好之后,F9运行这个项目。然后,单击View浏览现有的Web   服务,单击Bean1WSDL连接,我们可以在浏览器中察看它的WSDL描述。在浏览器地址栏复制WSDL地址,为下一步使用.NET开发客户端调用程序做准备。  
       
     
      3.   VS.NET生成一个.NET的客户端  
     
      新建一个项目(WinForm,ASP.net都可以),我在这里使用的是一个Asp.Net项目。在起始页面上放置一个文本输入框用来显示调用Web   Services的结果,放置一个按钮,用来单击调用Web   Services。然后,选择添加Web   引用,在WSDL一栏中把刚才得到的WSDL地址复制过来,Web   引用的名称输入JavaService,单击添加引用按钮就可以了。此时,我们可以在VS.net   Solution   Explore中看到这个Web   引用。  
     
      在按钮的单击事件中输入下列代码:  
     
      JavaService.Bean1   bean   =   new   JavaService.Bean1();  
     
      TextBox1.Text   =   bean.getSample.ToString   ();  
     
      这样,一个.NET客户端就完成了,测试一下,工作正常,OK.  
       
     
    :Java做客户端调用.NET写的   Web   Services  
       
     
      有了上面的成功,使我以为用Java做客户端调用也是一件十分容易的事情,可实际情况却耗费了我两天时间才得以实现。  
       
     
      1.   VS.NET新建一个Asp   Web   Services工程,添加一个web   服务,命名为SumService.asmx。新增一个web   method,代码如下:  
       
     
      [WebMethod]  
     
      public   int   IntAdd(int   a,int   b) {return   a+b   ;}  
     
      然后运行它,并利用IE进行测试成功。  
       
     
      2.   打开jbuilder9.0,新建一个项目,添加一个java   class   ,命名为TestNetService,输入下列代码:  
       
      package   MyWebServiceJavaClient;  
      import   java.util.Date;  
      import   java.text.DateFormat;  
      import   java.util.Date;  
      import   java.text.DateFormat;  
      import   org.apache.axis.client.Call;  
      import   org.apache.axis.client.Service;  
      import   javax.xml.namespace.QName;  
      import   java.lang.Integer;  
      import   javax.xml.rpc.ParameterMode;  
      /**  
      *   <p>Title:   </p>  
      *   <p>Description:   </p>  
      *   <p>Copyright:   Copyright   (c)   2004</p>  
      *   <p>Company:   </p>  
      *   @author   not   attributable  
      *   @version   1.0  
      */  
      public   class   TestNetService   {  
      public   TestNetService()   {}  
      public   static   void   main(String[]   args)   {  
      try   {  
      Integer   i   =   new   Integer(1);  
      Integer   j   =   new   Integer(2);  
      String   endpoint="
    http://localhost/MyServices/WebServiceTest/SumService.asmx";  
      Service   service   =   new   Service();  
      Call   call   =   (Call)service.createCall();  
      call.setTargetEndpointAddress(new   java.net.URL(endpoint));  
      call.setOperationName(new   QName("
    http://www.my.com/SU","IntAdd"));  
      call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);  
      call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);  
      call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);  
      call.setUseSOAPAction(true);  
      call.setSOAPActionURI("
    http://www.my.com/Rpc");  
      Integer   k   =   (Integer)call.invoke(new   Object[]{i,j});  
      System.out.println(   "result   is   "   +   k.toString()   +   ".");  
      }  
      catch   (Exception   e)   {System.err.println(e.toString());}  
      }  
      }  
     
      运行上面的java客户端程序,你会发现系统会抛出一个SoapAction异常。奇怪,怎么会错误呢?想到了我开发的asp   web   services没有指定SoapAction,于是在SumService.asmx中的   [web   method]   的上一行添加下列代码:  
      [SoapRpcMethod(Action="
    http://www.my.com/Rpc",RequestNamespace="http://www.my.com/SU",ResponseNamespace="http://www.my.com/SU")]  
     
      重新编译运行asp   web   services后,在执行java程序,这时会发现输出了正确的结果3  
     
      这样,用java调用.net生成的web   services也算初步完成了,好像也不是很复杂是吧。其实,在实际工作中,我一开始并没有在网上找到一个很好的代码例子,全部是依靠jbuilder      axis的帮助完成的,   可总是提示什么找不到相应的SoapAction。而实际上,我在运行了asp   web   services后是可以在IE浏览器中看到那个SoapAction的。我试验过将默认的SoapAction拷贝到java代码中,但是java客户端依然抛出同样的异常,这要我也很迷惑。  
       
     
    :总结  
     
      经过两天的试验,终于从技术上明确了通过Web   Services实现.net      java的互通是可能的。当然有几点是需要注意的:  
     
      1.   在提供Web   Services的时候,尽量使用xml   schema中支持的变量类型做参数。如果使用.net   中的dataset这种类型,对于java来说解析起来将是一个灾难,当然,理论上是可以解析的。但是从效率角度来说,在Web   Services与客户端交换信息的过程中,始终有一个序列化和反序列化的问题。如果使用dataset这种类型,系统还需要对它进行序列化操作,这将是一个很耗费资源的过程。而使用string类型将简单很多。  
     
      2.   如果使用了soap   header等扩展功能,例如使用了微软提供的WSE技术,它们之间的相互通信需要作特殊处理。 

     

  • 相关阅读:
    图解集合5:不正确地使用HashMap引发死循环及元素丢失
    图解集合4:HashMap
    图解集合3:CopyOnWriteArrayList
    图解集合2:LinkedList
    SharePoint PowerShell 修改母版页
    SharePoint PowerShell 启动工作流
    SharePoint REST 服务获取讨论版问题
    SharePoint 前端开发常用的对象之_spPageContextInfo
    SharePoint 读取内容的插件之SharepointPlus
    SharePoint 配置PowerShell任务计划
  • 原文地址:https://www.cnblogs.com/quietwalk/p/1822349.html
Copyright © 2020-2023  润新知