Java調用.Net WebService 發生異常:服務器未能識別 HTTP 頭 SOAPA...

使用XFire方式調用這個Web服務,但出現了異常:SoapException: 服務器未能識別 HTTP 頭 SOAPAction 的值。

這多是 Client 端沒有正確的按照 WSDL 創建反項工程的緣由。

咱們的WSDL地址是:WEB服務地址+?wsdl ,如:http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl

SOAPAction 這個字段的設置規則也在 WSDL 裏能夠找到,你在 WSDL 裏找一下:<soap:operation soapAction=

dot net 的默認soapaction 是和發佈的Namespace/方法名,如上面的WSDL:<soap:operation soapAction="http://WebXml.com.cn/getVersionTime" style="document" />

而java寫的部分代碼產生的soapaction="" 

通常能夠嘗試在http header裏將SOAPAction 設置爲.NET 的 WEB服務的Namespace :http://WebXml.com.cn。若是找不到,嘗試着在http header裏將SOAPAction 設置爲""(空),但必定要設置,若是你用的是 XFire 理論上是不用設置,多是你的 Client 端沒有正確的按照 WSDL 創建反項工程的緣由,不過 XFire 應該也能夠手動設置: Client.setProperty("SOAPAction",""); 



另外,.net 的 webservice 指定了namespace,咱們的服務Namespace是:http://WebXml.com.cn/,可是java調用時沒有指定,若是咱們仔細查看.net webservice 的soap 請求格式時會發現,下面是一個 SOAP 請求和響應示例(部分代碼)要求的格式是:

java

......
<soap:Body>
    <getDetailInfoByTrainCode xmlns="http://WebXml.com.cn/">
      <TrainCode>string</TrainCode>
      <UserID>string</UserID>
    </getDetailInfoByTrainCode>
  </soap:Body>
......



//JAVA 調用原來代碼:web

......
try{
Service service = new Service();
   Call call = (Call) service.createCall();
   call.setOperationName(new QName("", "getDetailInfoByTrainCode"));
   call.addParameter("TrainCode", XMLType.XSD_STRING, ParameterMode.IN);
   call.addParameter("UserID", XMLType.XSD_STRING, ParameterMode.IN);
   call.setTargetEndpointAddress(new URL(
       "http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx")); 
......
}



//JAVA 代碼修改爲如下代碼:服務器

   call.setOperationName(new QName("http://WebXml.com.cn/", "GetTestQuestions"));






其餘參考相關連接:
Soap action is emptyspa

相關文章
相關標籤/搜索