Java与.NET 的Web Services相互调用

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;

/**

1<p>Title: </p>
1<p>Description: </p>
1<p>Copyright: Copyright (c) 2004</p>
1<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 技术,它们之间的相互通信需要作特殊处理。请参见:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwse/html/wsejavainterop.asp

本文参考:

http://forum.java.sun.com/thread.jsp?thread=386360&amp;forum=331&amp;message=1661636

由于本人水平有限,请大家多多指正。

eMail:dlut_[email protected]

Published At
Categories with Web编程
Tagged with
comments powered by Disqus