问题描述
大家好,我使用AXIS2调用WCF的时候遇到了如下的错误:Exceptioninthread"main"org.apache.axis2.AxisFault:MustUnderstandcheckfailedforheaderhttp://www.w3.org/2005/08/addressing:Action我通过两种方法调用都是一样的错误,axis2的工具生成的方法以及手写的方法,手写的方法如下:packagews;importjavax.xml.namespace.QName;importorg.apache.axiom.soap.SOAP11Constants;importorg.apache.axiom.soap.SOAP12Constants;importorg.apache.axis2.AxisFault;importorg.apache.axis2.Constants;importorg.apache.axis2.addressing.AddressingConstants;importorg.apache.axis2.addressing.EndpointReference;importorg.apache.axis2.addressing.RelatesTo;importorg.apache.axis2.client.Options;importorg.apache.axis2.rpc.client.RPCServiceClient;publicclassWebServiceTest{/***@paramargs*/publicstaticvoidmain(String[]args)throwsAxisFault{Object[]opAddEntryArgs=newObject[]{"100000260032","4832"};//Stringurl="http://r2-sv0038.connecteast.local/ETollingPortal2AbstractionServiceIVR/AccountBalance.svc?wsdl";Stringurl="http://r2-sv0038.connecteast.local/ETollingPortal2AbstractionServiceIVR/AccountBalance.svc";//url="http://www.w3.org/2005/08/addressing/anonymous.";Stringmethod="GetAccountBalance1";WebServiceTest.sendService(opAddEntryArgs,url,method);}publicstaticStringsendService(Object[]opAddEntryArgs,Stringurl,Stringmethod)throwsAxisFault{Stringxml=null;RPCServiceClientserviceClient=newRPCServiceClient();//serviceClient.engageModule(newjavax.xml.namespace.QName(org.apache.axis2.Constants.MODULE_ADDRESSING));Optionsoptions=serviceClient.getOptions();//这里设置使用soap1.2,wcf用的是wshttpbinding使用的也是soap1.2貌似axis默认使用soap1.1。//否则会报Exceptioninthread"main"org.apache.axis2.AxisFault:Transporterror:415Error://Cannotprocessthemessagebecausethecontenttype'text/xml;charset=UTF-8'//wasnottheexpectedtype'application/soap+xml;charset=utf-8'.的错误options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);//EndpointReferencetargetEPR=newEndpointReference(url);options.setTo(targetEPR);options.setTimeOutInMilliSeconds((long)600000);//options.setProperty(Constants.Configuration.ENABLE_SWA,Constants.VALUE_TRUE);//在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值QNameopAddEntry=newQName("http://tempuri.org/",method);//参数,如果有多个,继续往后面增加即可,不用指定参数的名称////Object[]opAddEntryArgs=newObject[]{xmlStr};//返回参数类型,这个和axis1有点区别//invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;//第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];//第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。//当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用newObject[]{}//如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,//该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同Class[]classes=newClass[]{String.class};xml=(String)serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0];System.out.println(xml);returnxml;}}
解决方案
解决方案二:
另外我在http://blogs.msdn.com/b/aszego/archive/2010/06/24/usernametoken-profile-vs-wcf.aspx看到这样一段话没太理解啊。。InteroperabilitywithAxisIntheactualscenarioIwrotethiscustomtokenfor,theJava-basedservicedidn’tliketheaddressingheadersthatWCFgenerated.Inparticular,thewsa:ActionheaderhadmustUnderstandsettotrue,andwegottheerrormessagethat“MustUnderstandcheckfailedforheaderhttp://www.w3.org/2005/08/addressing:Action”.WCFdoesn’tallowremovingmustUnderstandfromtheaddressingheaders(unlessyouremoveitfromtheserializedmessage).Therefore,inthesampleIsimplyaskWCFtonotaddtheaddressingheadersbysettingMessageVersiontoSoap11.
解决方案三:
解决方案四:
webservice啊webservice,不是说跨平台么你这是肿么了~~
解决方案五:
解决方案六:
我也遇到这这个错。请问你解决了嘛?
解决方案七:
引用5楼u010795216的回复:
我也遇到这这个错。请问你解决了嘛?
这之后还遇见很多问题,都忘了专门解决这个问题的办法了。最后好用的配置如下,需要在lib里添加addressing.mar的包TripPassServiceStubtpss=newTripPassServiceStub();tpss._getServiceClient().engageModule("addressing");tpss._getServiceClient().getOptions().setProperty(AddressingConstants.WS_ADDRESSING_VERSION,org.apache.axis2.addressing.AddressingConstants.Final.WSA_NAMESPACE);intsetWebServiceTimeOutInSeconds=mySession.getVariable(IProjectVariables.SET_WEB_SERVICE_TIME_OUT_IN_SECONDS).getSimpleVariable().getIntValue();tpss._getServiceClient().getOptions().setTimeOutInMilliSeconds(setWebServiceTimeOutInSeconds*1000);tpss._getServiceClient().getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT,true);tpss._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED,"false");//设置不受限制.
解决方案八:
你好我也遇见了相同的问题TripPassServiceStubtpss=newTripPassServiceStub();这个是什么啊能详细说一下吗