| 
                                 
                                    
                                    
                                 
                                
                                    
                                    使用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 请求和响应示例(部分代码)要求的格式是:
 
  ...... <soap:Body>     <getDetailInfoByTrainCode xmlns="http://WebXml.com.cn/">       <TrainCode>string</TrainCode>       <UserID>string</UserID>     </getDetailInfoByTrainCode>   </soap:Body> ......
 
 
  //JAVA 调用原来代码:
  ...... 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 empty
 
  
                             |