月亮的太陽

          小乖的BLOG
          posts - 114, comments - 41, trackbacks - 0, articles - 27
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java與.NET 的Web Services相互調(diào)用

          Posted on 2005-12-29 09:59 月亮的太陽 閱讀(369) 評論(0)  編輯  收藏 所屬分類: 編程
               一:簡介

            本文介紹了Java與.NET開發(fā)的Web Services相互調(diào)用的技術(shù)。本文包括兩個部分,第一部分介紹了如何用.NET做客戶端調(diào)用Java寫的Web Services,第二部分介紹了如何用Java做客戶端調(diào)用.NET開發(fā)的Web Services。

            二:項目需要的工具

            Windows2000 Server(IIS)

            Jbuilder9.0( 含有Tomcat , axis)

            JDK1.4+Java Web Services Develop

            VS.Net 2003

            備注:如果沒有JBuilder的話就需要自己下載安裝Tomcat4.1 以及 Axis的開發(fā)包,并做相應(yīng)配置。由于網(wǎng)上有很多這樣的文章,這里就不一一說明了。

            三:用.NET做客戶端調(diào)用Java寫的Web Services

            1. 生成一個Java Web Services

            使用JBuilder 生成一個Web Services是非常簡單的,我完全是按照它的幫助做的,只要一步步做下去就可以了。具體路徑是Developing Web Services -> tutorials : Web Services(Axis) -> Creating a simple Web Services

            2. 發(fā)布這個Web Services并得到它的WSDL

            Web Services生成好之后,F(xiàn)9運行這個項目。然后,單擊View瀏覽現(xiàn)有的Web 服務(wù),單擊Bean1的WSDL連接,我們可以在瀏覽器中察看它的WSDL描述。在瀏覽器地址欄復(fù)制WSDL地址,為下一步使用.NET開發(fā)客戶端調(diào)用程序做準(zhǔn)備。

            3. 用VS.NET生成一個.NET的客戶端

            新建一個項目(WinForm,ASP.net都可以),我在這里使用的是一個Asp.Net項目。在起始頁面上放置一個文本輸入框用來顯示調(diào)用Web Services的結(jié)果,放置一個按鈕,用來單擊調(diào)用Web Services。然后,選擇添加Web 引用,在WSDL一欄中把剛才得到的WSDL地址復(fù)制過來,Web 引用的名稱輸入JavaService,單擊添加引用按鈕就可以了。此時,我們可以在VS.net 的Solution Explore中看到這個Web 引用。

            在按鈕的單擊事件中輸入下列代碼:

            JavaService.Bean1 bean = new JavaService.Bean1();
            TextBox1.Text = bean.getSample.ToString ();

            這樣,一個.NET客戶端就完成了,測試一下,工作正常,OK.

              四:用Java做客戶端調(diào)用.NET寫的 Web Services

            有了上面的成功,使我以為用Java做客戶端調(diào)用也是一件十分容易的事情,可實際情況卻耗費了我兩天時間才得以實現(xiàn)。

            1. 用VS.NET新建一個Asp Web Services工程,添加一個web 服務(wù),命名為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客戶端程序,你會發(fā)現(xiàn)系統(tǒng)會拋出一個SoapAction異常。奇怪,怎么會錯誤呢?想到了我開發(fā)的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后,在執(zhí)行java程序,這時會發(fā)現(xiàn)輸出了正確的結(jié)果3。

            這樣,用java調(diào)用.net生成的web services也算初步完成了,好像也不是很復(fù)雜是吧。其實,在實際工作中,我一開始并沒有在網(wǎng)上找到一個很好的代碼例子,全部是依靠jbuilder 和 axis的幫助完成的, 可總是提示什么找不到相應(yīng)的SoapAction。而實際上,我在運行了asp web services后是可以在IE瀏覽器中看到那個SoapAction的。我試驗過將默認(rèn)的SoapAction拷貝到j(luò)ava代碼中,但是java客戶端依然拋出同樣的異常,這要我也很迷惑。

            五:總結(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)還需要對它進行序列化操作,這將是一個很耗費資源的過程。而使用string類型將簡單很多。

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

          主站蜘蛛池模板: 无棣县| 留坝县| 偏关县| 屏边| 高邑县| 同德县| 会东县| 嵊泗县| 双江| 福安市| 黎城县| 万山特区| 历史| 石家庄市| 固始县| 井研县| 青川县| 靖边县| 若尔盖县| 大同县| 双江| 鲁甸县| 汶上县| 磐安县| 星座| 汉中市| 开封市| 金昌市| 乐山市| 友谊县| 前郭尔| 陆丰市| 将乐县| 略阳县| 兰西县| 大冶市| 桃源县| 汶川县| 靖西县| 班戈县| 西乡县|