java与.net开发的web services相互调用

来源:互联网 发布:赌钱麻将软件 编辑:程序博客网 时间:2024/05/22 10:54
一:简介

本文介绍了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技术,它们之间的相互通信需要作特殊处理。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
原创粉丝点击