一:簡介
本文介紹了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 ,命名為Tes.NetService,輸入下列代碼:
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 Tes.NetService {
public Tes.NetService() {
}
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技術,它們之間的相互通信需要作特殊處理。