Java与.NET的WebServices相互调用
一:簡介?
本文介紹了Java與.NET開發(fā)的Web Services相互調(diào)用的技術(shù)。本文包括兩個部分,第一部分介紹了如何用.NET做客戶端調(diào)用Java寫的Web Services,第二部分介紹了如何用Java做客戶端調(diào)用.NET開發(fā)的Web Services。
二:項目需要的工具
WindowsXP Professial(IIS)
1.生成一個Java Web Services
使用Eclipse生成一個Web Services是非常簡單的。新建一個Web工程,右鍵建立一個Class,名為HelloClient.java。代碼如下: java 代碼: public?class?HelloClient????
{????
public?String?getName(String?name)????
{????
return?"Hello,"+name;????
}????
}???
右鍵此文件選擇"WebServices"-->"Create Web Service"即可部署為本機(jī)的一個ws。在IE瀏覽器中輸入http://localhost:8008/testWebService/services/HelloClient可以看到已經(jīng)部署了的HelloClient服務(wù)。輸入http://localhost:8008/testWebService/services/HelloClient?wsdl這個服務(wù)的描述文件。
???? 新建一個項目(WinForm,ASP.net都可以),我在這里使用的是一個Asp.Net項目。在起始頁面上放置一個文本輸入框用來輸入,一個標(biāo)簽用來顯示調(diào)用Web Services的結(jié)果,放置一個按鈕,用來單擊調(diào)用Web Services。然后,選擇添加Web 引用,URL一欄里填入http://localhost:8008/testWebService/services/HelloClient?wsdl,Web 引用的名稱輸入JavaWebService,單擊添加引用按鈕就可以了。此時,我們可以在VS.net 的Solution Explore中看到這個Web 引用。
添加代碼如下:
protected?System.Web.UI.WebControls.Button?btnSend;????
protected?System.Web.UI.WebControls.Label?lblMsg;????
???
private?JavaWebService.HelloClientService?ws;????
private?void?Page_Load(object?sender,?System.EventArgs?e)????
{????
//?在此處放置用戶代碼以初始化頁面????
ws=new?testWebService.JavaWebService.HelloClientService();????
}????
???
private?void?btnSend_Click(object?sender,?System.EventArgs?e)????
{????
lblMsg.Text=ws.getName(txtName.Text);????
}???
?
這樣,一個.NET客戶端就完成了,測試一下,工作正常,OK.
四:用Java做客戶端調(diào)用.NET寫的 Web Services
1. 用VS.NET新建一個Asp Web Services工程,添加一個web 服務(wù),命名為Service1.asmx。新增一個web method,代碼如下:
c# 代碼://指定SoapAction????
[SoapRpcMethod(Action="http://www.zjh.com/Rpc",RequestNamespace="http://www.zjh.com/SU",ResponseNamespace="http://www.zjh.com/SU")]????
[WebMethod]????
public?string?getName(string?name)????
{????
return?"Hello"+name;????
}??
?
然后運行它,并利用IE進(jìn)行測試成功。
2. 打開Eclipse,新建一個Web項目,添加一個JSP頁面 ,命名為action_hello.jsp,輸入下列代碼:
java 代碼:<%@page?pageEncoding="GBK"?contentType="text/html;?charset=GBK"?%>????
<%@page?import="org.apache.axis.client.Call"%>????
<%@page?import="org.apache.axis.client.Service"%>????
<%@page?import="javax.xml.namespace.QName"%>????
java?代碼
<%????
request.setCharacterEncoding("GBK");????
String?name=request.getParameter("name");????
String?endpoint="http://localhost/HelloClient/Service1.asmx";????
Service?service?=?new?Service();????
Call?call?=?(Call)service.createCall();????
call.setTargetEndpointAddress(new?java.net.URL(endpoint));????
call.setOperationName(new?QName("http://www.zjh.com/SU","getName"));????
call.addParameter("name",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);????
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);????
call.setUseSOAPAction(true);????
call.setSOAPActionURI("http://www.zjh.com/Rpc");????
String?res?=(String)call.invoke(new?Object[]{name});????
out.print(res);????
%>????
?
這個要比Java調(diào)用Java寫的ws來的復(fù)雜。ws和Java客戶端都要設(shè)置SOAPAction,否則會有異常說 System.Web.Services.Protocols.SoapException: 服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值
五:總結(jié)
經(jīng)過兩天的試驗,終于從技術(shù)上明確了通過Web Services實現(xiàn).net 與 java的互通是可能的。當(dāng)然有幾點是需要注意的:
1. 在提供Web Services的時候,盡量使用xml schema中支持的變量類型做參數(shù)。如果使用.net 中的dataset這種類型,對于java來說解析起來將是一個災(zāi)難,當(dāng)然,理論上是可以解析的。但是從效率角度來說,在Web Services與客戶端交換信息的過程中,始終有一個序列化和反序列化的問題。如果使用dataset這種類型,系統(tǒng)還需要對它進(jìn)行序列化操作,這將是一個很耗費資源的過程。而使用string類型將簡單很多。
2. 如果使用了soap header等擴(kuò)展功能,例如使用了微軟提供的WSE技術(shù),它們之間的相互通信需要作特殊處理。
?引自:http://www.cnblogs.com/lzhdim/archive/2008/12/21/1359308.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/xcsn/p/4381128.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java与.NET的WebServices相互调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:WINFORM多线程编程
- 下一篇: PSP《超级机器人大战》机战AP全破心得