zoukankan
html css js c++ java
【转】Java与.NET的WebServices相互调用
Java与.NET的WebServices相互调用
Java与.NET 的Web Services相互调用
〖摘自:DotNet男孩社区〗
一:简介
本文介绍了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:
//
msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwse/html/wsejavainterop.asp
本文参考:
http:
//
forum.java.sun.com/thread.jsp?thread=386360&forum=331&message=1661636
查看全文
相关阅读:
二进制运算基础
初识Tomcat系统架构
MySQL InnoDB引擎锁的总结
Java并发编程:并发容器之CopyOnWriteArrayList
java类的加载机制
Nginx实现tomcat集群进行负载均衡
Java序列化对象为字符串并将字符串反序列化为对象
数据库的四大特性及事务的隔离级别
人性的弱点
华为工作法摘抄笔记
原文地址:https://www.cnblogs.com/ding0910/p/615005.html
最新文章
Dapper简易教程(翻译自Github上StackExchange/Dapper)
[C#]实现任何数据库类型的DbHelper帮助类
[C#]SQLite执行效率优化结论
Windows 窗体中的事件顺序
[C#]使用Windows Form开发的百度网盘搜索工具
[C#]使用Windows Form开发的天气预报小工具
[C#]使用控制台获取天气预报
将字符串按指定的个数进行分组
SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);
一个Tomcat下部署两个,甚至多个项目
热门文章
java多线程
css背景图片充满DIV
java springboot 大文件分片上传处理
SpringBoot 整合 Redis缓存
IISARR方式整合Tomcat失敗
java设计模式自我总结---代理模式
java设计模式自我总结---适配器模式
Felx布局基础教程
Java NIO:Buffer、Channel 和 Selector
ReentrantLock实现原理
Copyright © 2011-2022 走看看