DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> Java與.NET的WebServices相互調用
Java與.NET的WebServices相互調用
編輯:XML詳解     

本文包括兩個部分,第一部分介紹了如何用.NET做客戶端調用Java寫的Web Services,第二部分介紹了如何用Java做客戶端調用.Net開發的Web Services。

  項目需要的工具 

  ◆WindowsXP Professial(IIS)

  ◆Eclipse3.1(已裝好Tomcat axis)

  ◆VS.Net 2003

  備注:下載安裝Tomcat5.5.16 以及 Axis的開發包,並做相應配置。看我前一片文檔。

  用.Net做客戶端調用Java寫的Web Services

  1.生成一個JavaWeb Services

  使用Eclipse生成一個Web Services是非常簡單的。新建一個Web工程,右鍵建立一個Class,名為HelloClIEnt.Java。代碼如下:

  Java代碼:

public class HelloClIEnt
{
public String getName(String name)
{
return "Hello,"+name;
}
}

  右鍵此文件選擇"WebServices"-->"Create Web Service"即可部署為本機的一個ws。在IE浏覽器中輸入http://localhost:8008/testWebService/services/HelloClient可以看到已經部署了的HelloClient服務。輸入http://localhost:8008/testWebService/services/HelloClIEnt?wsdl這個服務的描述文件。

  新建一個項目(WinForm,ASP.net都可以),我在這裡使用的是一個ASP.Net項目。在起始頁面上放置一個文本輸入框用來輸入,一個標簽用來顯示調用Web Services的結果,放置一個按鈕,用來單擊調用Web Services。然後,選擇添加Web 引用,URL一欄裡填入http://localhost:8008/testWebService/services/HelloClIEnt?wsdl,Web 引用的名稱輸入JavaWebService,單擊添加引用按鈕就可以了。此時,我們可以在VS.Net 的Solution Explore中看到這個Web 引用。添加代碼如下:

C# 代碼:

protected System.Web.UI.WebControls.TextBox txtName;
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做客戶端調用.Net寫的 Web Services

  1. 用VS.Net新建一個ASP Web Services工程,添加一個web 服務,命名為Service1.asmx。新增一個web method,代碼如下:

  C# 代碼:

//指定SoapAction
[SoapRpcMethod(Action="http://www.xxx.com/Rpc",
RequestNamespace="http://www.xxx.com/SU",ResponseNamespace="http://www.xxx.com/SU")]
[WebMethod]
public string getName(string name)
{
return "Hello"+name;
}

  然後運行它,並利用IE進行測試成功。

  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調用Java寫的ws來的復雜。ws和Java客戶端都要設置SOAPAction,否則會有異常說 System.Web.Services.Protocols.SoapException: 服務器未能識別 HTTP 標頭 SOAPAction 的值

  總結

  經過兩天的試驗,終於從技術上明確了通過Web Services實現.Net 與 Java的互通是可能的。當然有幾點是需要注意的:

  1. 在提供Web Services的時候,盡量使用XML schema中支持的變量類型做參數。如果使用.Net 中的dataset這種類型,對於Java來說解析起來將是一個災難,當然,理論上是可以解析的。但是從效率角度來說,在Web Services與客戶端交換信息的過程中,始終有一個序列化和反序列化的問題。如果使用dataset這種類型,系統還需要對它進行序列化操作,這將是一個很耗費資源的過程。而使用string類型將簡單很多。

  2. 如果使用了soap header等擴展功能,例如使用了微軟提供的WSE技術,它們之間的相互通信需要作特殊處理。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved