zoukankan      html  css  js  c++  java
  • Java与.NET 的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 服务,单击Bean1的WSDL连接,我们可以在浏览器中察看它的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技术,它们之间的相互通信需要作特殊处理。

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/kingboy2008/p/2055608.html
Copyright © 2011-2022 走看看