一.參考文獻
1. http://www.cnblogs.com/xuqifa100/archive/2007/12/13/993926.html 使用.net如何發布web service
2.WebService跨語言的問題
3.Java調用DotNet WebService為什麼那麼難?
4. java調用.net服務例子
5.使用axis調用.net服務端
二.概述
前面寫了一篇部落格eclipse+webservice 是在java環境下進行的。考慮到webservice的跨系統,跨語言,跨網路的特性,下面寫了一個執行個體來測試其跨語言的的特性。
首先是用asp.net開發一個webservice,然後再java中建立用戶端來調用這個service。
三.執行個體
(1)開啟visual studio 2010,建立項目,如所示:
建立的項目結果如所示:
(2)在Service1.asmx.cs中添加服務方法,代碼如下:
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Web;<br />using System.Web.Services;</p><p>namespace AspWebService1<br />{<br /> /// <summary><br /> /// Service1 的摘要說明<br /> /// </summary><br /> [WebService(Namespace = "http://erplab.sjtu.edu/")]<br /> [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]<br /> [System.ComponentModel.ToolboxItem(false)]<br /> // 若要允許使用 ASP.NET AJAX 從指令碼中調用此 Web 服務,請取消對下行的注釋。<br /> // [System.Web.Script.Services.ScriptService]<br /> public class Service1 : System.Web.Services.WebService<br /> {</p><p> [WebMethod]<br /> public string HelloWorld()<br /> {<br /> return "Hello World";<br /> }</p><p> [WebMethod]<br /> public string sayHelloToPersonNew(String name)<br /> {<br /> if (name == null)<br /> {<br /> name = "nobody";<br /> }<br /> return "hello," + name;<br /> }</p><p> [WebMethod]<br /> public double count(double number, double price, double discount)<br /> {<br /> return number * price * discount;<br /> }</p><p> [WebMethod]<br /> public float getFloat(float x)<br /> {<br /> return x;<br /> }</p><p> //加法<br /> [WebMethod]<br /> public float plus(float x, float y)<br /> {<br /> return x + y;<br /> }</p><p> //減法<br /> [WebMethod]<br /> public float minus(float x, float y)<br /> {<br /> return x - y;<br /> }</p><p> //乘法<br /> [WebMethod]<br /> public float multiply(float x, float y)<br /> {<br /> return x * y;<br /> }</p><p> //除法<br /> [WebMethod]<br /> public float divide(float x, float y)<br /> {<br /> if (y != 0)<br /> {<br /> return x / y;<br /> }<br /> else<br /> return -1;<br /> }</p><p> }<br />}(3)發布服務,按CTRL+F5運行項目,即可開啟服務首頁:http://localhost:5329/Service1.asmx,如所示:
中顯示的就是我們在Service1.asmx.cs檔案中定義的服務方法。點擊“服務說明”可以查看webservice的wsdl檔案。
(4)編寫java用戶端來測試webservice,java程式如下所示:
package edu.sjtu.erplab.aspwebservice;</p><p>import javax.xml.namespace.QName;<br />import javax.xml.rpc.ParameterMode;<br />import org.apache.axis.client.Call;<br />import org.apache.axis.client.Service;<br />import org.apache.axis.encoding.XMLType;</p><p>public class AspWebServiceTestClient1 {</p><p>public static void main(String[] args) throws Exception {<br />// 定義方法<br />String method = "HelloWorld";<br />String methodPlus = "plus";<br />String methodMinus = "minus";<br />String methodMultiply = "multiply";<br />String methodDivide = "divide";<br />String methodSayTo = "sayHelloToPersonNew";<br />// 定義服務<br />Service service = new Service();</p><p>// 測試1:調用HelloWorld方法,方法沒有參數<br />Call call = (Call) service.createCall();<br />call.setTargetEndpointAddress(new java.net.URL(<br />"http://localhost:5329/Service1.asmx"));<br />call.setUseSOAPAction(true);<br />// 第一種設定傳回值類型為String的方法<br />call.setReturnType(XMLType.SOAP_STRING);<br />call.setOperationName(new QName("http://erplab.sjtu.edu/", method));<br />call.setSOAPActionURI("http://erplab.sjtu.edu/HelloWorld");<br />String retVal1 = (String) call.invoke(new Object[] {});<br />System.out.println(retVal1);</p><p>// 測試2: 調用sayHelloToPersonNew方法,方法有一個參數:name。sayHelloToPersonNew(String name)<br />Call call2 = (Call) service.createCall();<br />call2.setTargetEndpointAddress(new java.net.URL(<br />"http://localhost:5329/Service1.asmx"));<br />call2.setUseSOAPAction(true);<br />call2.setReturnType(new QName("http://www.w3.org/2001/XMLSchema",<br />"string"));<br />// 第二種設定傳回值類型為String的方法<br />call2.setOperationName(new QName("http://erplab.sjtu.edu/", methodSayTo));<br />call2.setSOAPActionURI("http://erplab.sjtu.edu/sayHelloToPersonNew");<br />call2.addParameter(new QName("http://erplab.sjtu.edu/", "name"),// 這裡的name對應參數名稱<br />XMLType.XSD_STRING, ParameterMode.IN);<br />String retVal2 = (String) call2<br />.invoke(new Object[] { "asp webservice" });<br />System.out.println(retVal2);</p><p>// 測試3: 調用sgetFloat方法,方法有一個參數:x,為float類型<br />Call call3 = (Call) service.createCall();<br />call3.setTargetEndpointAddress(new java.net.URL(<br />"http://localhost:5329/Service1.asmx"));<br />call3.setUseSOAPAction(true);<br />call3.setEncodingStyle(null);// 必須有,否為會系統報錯。最關鍵的語句。決定產生xmlns的中soap的命名空間<br />// 第一種設定傳回值類型為Float類型的方法<br />call3.setReturnType(org.apache.axis.encoding.XMLType.XSD_FLOAT);<br />call3.setOperationName(new QName("http://erplab.sjtu.edu/", "getFloat"));<br />call3.setSOAPActionURI("http://erplab.sjtu.edu/getFloat");<br />call3.addParameter(new QName("http://erplab.sjtu.edu/", "x"),// 這裡的x對應參數名稱<br />XMLType.XSD_FLOAT, ParameterMode.INOUT);<br />Float retVal3 = (Float) call3.invoke(new Object[] { 123 });<br />System.out.println(retVal3);</p><p>// 測試4: 調用plus方法,方法有兩個參數:x,y。plus(float x, float y)<br />Call call4 = (Call) service.createCall();<br />call4.setTargetEndpointAddress(new java.net.URL(<br />"http://localhost:5329/Service1.asmx"));<br />call4.setUseSOAPAction(true);<br />call4.setEncodingStyle(null);<br />// 第二種設定傳回值類型為Float類型的方法<br />call4.setReturnType(new QName("http://www.w3.org/2001/XMLSchema",<br />"float"));<br />call4.setOperationName(new QName("http://erplab.sjtu.edu/", methodPlus));// 加法<br />call4.setSOAPActionURI("http://erplab.sjtu.edu/plus");<br />call4.addParameter(new QName("http://erplab.sjtu.edu/", "x"),// 參數x<br />org.apache.axis.encoding.XMLType.XSD_FLOAT, ParameterMode.IN);<br />call4.addParameter(new QName("http://erplab.sjtu.edu/", "y"),// 參數y<br />XMLType.XSD_FLOAT, ParameterMode.IN);<br />Float retVal4 = (Float) call4.invoke(new Object[] { 5, 6 });<br />System.out.println(retVal4);<br />}<br />}<br />運行結果:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.<br />Hello World<br />hello,asp webservice<br />123.0<br />11.0<br />
注意點:
(a)我們發現如果參數是String類型的,那麼可以不需要設定call的參數 call3.setEncodingStyle(null); 但是如果傳入參數為float類型,那麼就必須加上這一條語句。
(b)設定傳回值類型有兩種方式:
一種是
call.setReturnType(XMLType.SOAP_STRING);另外一種是
call2.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","string"));這兩種方法是等價的