java 跟.net webservice 互連問題

來源:互聯網
上載者:User

最近忙一個跟國外公司合作的項目,國外公司提供的web service不是我用的.net 平台,折騰了良久,發現了不少問題,歸納一下,

首先我這邊拿到的是國外提供的wsdl 檔案,我用microsoft的wsdl.exe 產生我需要的cs代碼,通過這種方式來完成對國外web service的調用,用wsdl.exe ,:

開啟命令提示視窗後:

這樣我們就可以調用國外的web services了,但是請注意:

微軟產生的程式碼比wsdl中所定義的方法,屬性多了不少的東西,就個人理解說明一下:

1.為每一個方法提供了非同步呼叫的方法,如一個方法名為CreateOrder,則多了 BeginCreateOrder,EndCreateOrder,CreateOrderAsync,OnCreateOrderOperationCompleted

具體方法的使用和說明可參考微軟msdn的說明

2.具體參數是enum和特殊日期類型,microsoft自動為我們增加了Specified尾碼的bool欄位,如enum類型 flag,增加的名稱flagSpecified,請記得無比需要設該值為true,才可能為非.net 的web service 傳值.否則soap 包是不會有值的.

跟蹤soap 包的工具可用tcpTrace等

國外的用戶端需要回調我提供的.net 的web service環境,但國外公司調用報錯:

  <?xml version="1.0" encoding="utf-8" ?>

- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

- <soap:Body>

- <soap:Fault>

  <faultcode>soap:Client</faultcode>

  <faultstring>Server did not recognize the value of HTTP Header SOAPAction: .</faultstring>

  <detail />

  </soap:Fault>

  </soap:Body>

  </soap:Envelope>

網上找了些資料,放在這裡,今天需要驗證下是否可行:

最近做項目,涉及到web-service調用,現學了一個星期,現簡單的做一個小結。下面實現的是對傳喜物流系統(http://vip.cxcod.com/PodApi/GetPodStr.asmx?wsdl)的訂單跟蹤(web-service調用)功能。

一. 使用axis1.x調用webservice方法

Axis的最常用版本:1.4和2.0版本。以下為1.4版本

 核心代碼:

  // webserviceURL

      service_url = "http://vip.cxcod.com/PodApi/GetPodStr.asmx?wsdl";

      Service service = new Service();

      Call call = (Call) service.createCall();

      call.setTargetEndpointAddress(new java.net.URL(service_url));

// 設定要調用的方法

// http://intelink.net/是wsdl中definitions根節點的targetNamespace屬性值

call.setOperationName(new QName("http://intelink.net/","GetStrByJobno"));

// 該方法需要的參數

call.addParameter("CustNo",

  org.apache.axis.encoding.XMLType.XSD_STRING,

  javax.xml.rpc.ParameterMode.IN);

call.addParameter("passwd",

   org.apache.axis.encoding.XMLType.XSD_STRING,

   javax.xml.rpc.ParameterMode.IN);

call.addParameter("Jobno",

   org.apache.axis.encoding.XMLType.XSD_STRING,

   javax.xml.rpc.ParameterMode.IN);

// 方法的傳回值類型

call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);

// call.setUseSOAPAction(true); //call.setSOAPActionURI("http://intelink.net/GetStrByJobno");

// 調用該方法, new Object[] { CustNo, passwd, Jobno}為參數列表

String xmlStr = call.invoke(new Object[] { CustNo, passwd, Jobno}).toString();

} catch (Exception e) {

e.printStackTrace();

}

JAVA用這種方式調用webservice,需要注意的地方:

1. 伺服器未能識別 HTTP 標題 SOAPAction 的值:

癥狀一:

Web Service + ASP.NET 應用程式部署到伺服器預設目錄中,在IE中用http://<伺服器位址>/<程式目錄名>/<預設啟動頁面名>發生“伺服器未能識別 HTTP 標題 SOAPAction 的值”錯誤。

癥狀二:

在Java平台上調用.NET Web Service的服務時,出現"伺服器未能識別 HTTP 標題 SOAPAction 的值"。

癥狀三:

在Java平台下調用.NET WEB Service,出現資料時有時無。

解決對策:

給.NET的WebService類(即.asmx檔案下的類)添加屬性[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

小知識:

什麼是SoapAction?它在WSDL中有何作用?

SOAPAction HTTP request header被用來標識SOAP HTTP請求的目的地,其值是個URI地址。SOAP發送並不限制格式、URI特徵或其必須可解析,那麼在這種情況下,發送一個HTTP SOAP請求時,其HTTP用戶端必須使用/指明SOAPAction HTTP request header。

SOAPAction header的內容可以被用在服務端,諸如:防火牆適當的過濾基於HTTP的SOAP請求訊息等情境。SOAPAction header的值為空白串("")表示SOAP訊息的目的地由HTTP請求的URI標識;無值則表示沒有指定這條訊息的目的地。

本人補充:

在.NET環境調用.NET WebService出現 “SOAPAction 值在 XML Web services 的所有方法中不唯一的錯誤”,也可以通過此法解決。

2. 為了Java能夠調用WebService的方法,所以。NETP寫的WebServiced的每個方法都要聲明為Rpc方法,即添加"[SoapRpcMethod.....]".

例如:[WebMethod]

        [SoapRpcMethod(Use=SoapBindingUse.Literal,Action= http://tempuri.org/HelloWorld", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]

3. 對傳回值、參數的處理上:

應盡量將webservice方法的傳回值、參數都寫成字串(String)不要使用複雜物件類型,這樣便於在網路上傳輸。避免了複雜物件類型的不易轉換問題。。。對於傳回型別是字串數組型的,可以設定傳回型別為org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class.

二.利用xfire調用WebService

XFire是新一代的Java Web服務引擎,XFire使得在JavaEE應用中發布Web服務變得輕而易舉。和其他Web服務引擎相比,XFire的配置非常簡單,可以非常容易地和Spring整合,它使得Java開發人員終於可以獲得和.Net開發人員一樣的開發效率。

核心代碼:

Service service = new ObjectServiceFactory().create(IWebservice.class);

XFireProxyFactory factory =

new XFireProxyFactory(XFireFactory.newInstance().getXFire());

String url= "http://localhost:8080/webservices/services/webservices";

IWebservice iw = (IWebservice) factory.create(service, url);

List list=iw.getTest();

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.