使用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