Java與.NET 的Web Services相互調用
2024-07-10 13:01:42
供稿:網友
一:簡介
本文介紹了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技術,它們之間的相互通信需要作特殊處理。