Axis2 服务器未能识别 HTTP 头 SOAPAction 的值 的解决办法

来源:互联网 发布:c语言盗取qq号 编辑:程序博客网 时间:2024/05/21 06:50

公司的WebService服务端使用.NET生成,客户端需要使用Java来写,客户端代码如下:

import org.apache.axiom.om.OMAbstractFactory;import org.apache.axiom.om.OMElement;import org.apache.axiom.om.OMFactory;import org.apache.axiom.om.OMNamespace;import org.apache.axis2.AxisFault;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.client.ServiceClient;import java.rmi.RemoteException;public class Axis2Test{    public static void main(String[] args) throws RemoteException {        test();    }    public static void test() throws AxisFault {        try {            String url = "目标URL";            Options options = new Options();            EndpointReference targetEPR = new EndpointReference(url);            options.setTo(targetEPR);            ServiceClient sender = new ServiceClient();            sender.setOptions(options);            OMFactory fac = OMAbstractFactory.getOMFactory();            String tns = "目标的TargetNameSpace";            OMNamespace omNs = fac.createOMNamespace(tns, "");            OMElement method = fac.createOMElement("调用的方法名", omNs);            OMElement symbol = fac.createOMElement("参数名", omNs);            symbol.addChild(fac.createOMText(symbol, "参数值"));            method.addChild(symbol);            method.build();            OMElement result = sender.sendReceive(method);            System.out.println(result);        } catch (AxisFault axisFault) {            axisFault.printStackTrace();        }    }}

在运行这段代码时出现了如下错误:

org.apache.axis2.AxisFault: System.Web.Services.Protocols.SoapException: 服务器未能识别 HTTP 头 SOAPAction 的值: 。   在 System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()   在 System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)   在 System.Web.Services.Protocols.SoapServerProtocol.Initialize()   在 System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)   在 System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)    at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:508)    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:368)    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:414)    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225)    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:150)    at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:533)    at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:509)    at Axis2Test.test(Axis2Test.java:34)    at Axis2Test.main(Axis2Test.java:15)

经过查找之后发现JAX-WS规范不需要SoapAction,但是.NET需要,所以产生了这个错误。
在上网查找了之后发现可以在option对象下添加一个属性:

options.setAction("目标的TargetNameSpace"+"调用的方法名");

添加后代码为:

import org.apache.axiom.om.OMAbstractFactory;import org.apache.axiom.om.OMElement;import org.apache.axiom.om.OMFactory;import org.apache.axiom.om.OMNamespace;import org.apache.axis2.AxisFault;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.client.ServiceClient;import java.rmi.RemoteException;public class Axis2Test{    public static void main(String[] args) throws RemoteException {        test();    }    public static void test() throws AxisFault {        try {            String url = "目标URL";            Options options = new Options();            EndpointReference targetEPR = new EndpointReference(url);            options.setTo(targetEPR);            options.setAction("目标的TargetNameSpace"+"调用的方法名");//需要加上这条语句            ServiceClient sender = new ServiceClient();            sender.setOptions(options);            OMFactory fac = OMAbstractFactory.getOMFactory();            String tns = "目标的TargetNameSpace";            OMNamespace omNs = fac.createOMNamespace(tns, "");            OMElement method = fac.createOMElement("调用的方法名", omNs);            OMElement symbol = fac.createOMElement("参数名", omNs);            symbol.addChild(fac.createOMText(symbol, "参数值"));            method.addChild(symbol);            method.build();            OMElement result = sender.sendReceive(method);            System.out.println(result);        } catch (AxisFault axisFault) {            axisFault.printStackTrace();        }    }}

修改后信息返回成功

阅读全文
1 0
原创粉丝点击