Web services SOAP请求不是';t由第一个body子元素的QName调度

Web services SOAP请求不是';t由第一个body子元素的QName调度,web-services,soap,wsdl,wso2,wso2esb,Web Services,Soap,Wsdl,Wso2,Wso2esb,我有一个与此描述的服务。当使用此函数调用其操作createService时,一切正常。对于此服务,已在WSO2 ESB 4.6.0上创建了代理服务。是由ESB为代理服务生成的WSDL。当我尝试使用soapUI向代理服务发送相同的请求时,出现以下错误: 找不到操作的端点引用(EPR) /services/test.testHttpSoap11端点和WSA操作=。如果这 以前无法访问EPR,请与服务器管理员联系 使用ESB的代理服务测试工具发送此请求的主体我没有问题。我认为这是因为这个工具使用WS-

我有一个与此描述的服务。当使用此函数调用其操作
createService
时,一切正常。对于此服务,已在WSO2 ESB 4.6.0上创建了代理服务。是由ESB为代理服务生成的WSDL。当我尝试使用soapUI向代理服务发送相同的请求时,出现以下错误:

找不到操作的端点引用(EPR) /services/test.testHttpSoap11端点和WSA操作=。如果这 以前无法访问EPR,请与服务器管理员联系


使用ESB的代理服务测试工具发送此请求的主体我没有问题。我认为这是因为这个工具使用WS-Addressing来发送它。如果端点URL附加了
?createRequest
,则请求也会通过soapUI顺利发送。根据这一点,问题的原因是SOAPMessageBodyBasedDispatcher。出于某种原因,它不能通过SOAP主体元素的第一个子元素的QName识别目标操作。但我不明白为什么SOAPMessageBodyBasedDispatcher在我的案子里搞砸了。有什么想法吗?

WSO2 ESB 4.6.0和早期版本之间的主要区别是默认情况下WSO2 ESB 4.6.0启用直通传输(PTT)。PTT用于在WSO2 ESB中实现非常高的性能提升,您可以在这里找到一些数字


您的用例的主要问题是它期望SOAPMessageBodyBasedDispatcher分派操作名。SOAPMessageBodyBasedDispatcher构建消息并使用第一个子级的本地名称来调度此操作被认为是非常昂贵的,因此目前PPT中不支持此操作。目前,您可以将预期的SOAPAction作为HTTP头发送,以解决此问题。在此线程中,我提供了一些其他解决方案

WSO2 ESB 4.6.0和早期版本之间的主要区别是默认情况下WSO2 ESB 4.6.0启用直通传输(PTT)。PTT用于在WSO2 ESB中实现非常高的性能提升,您可以在这里找到一些数字


您的用例的主要问题是它期望SOAPMessageBodyBasedDispatcher分派操作名。SOAPMessageBodyBasedDispatcher构建消息并使用第一个子级的本地名称来调度此操作被认为是非常昂贵的,因此目前PPT中不支持此操作。目前,您可以将预期的SOAPAction作为HTTP头发送,以解决此问题。在本线程中,我提供了一些其他解决方案

更改httpGetProcessor在这里没有帮助,您必须更改transportSender和transportReceiver配置。您可以注释掉现有的PTT transportSender/transportReceiver,并在axis2.xml文件上取消注释NHTTP transportSender/transportReceiver配置

这就是ESB 4.6.0上的功能

<transportSender name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>

<transportReceiver name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>       
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.PassThroughNHttpGetProcessor</parameter>      
</transportReceiver>

真的
8280
真的
org.wso2.carbon.transport.nhttp.api.passthroughntpGetProcessor
你需要的是

<transportReceiver name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor</parameter>
    <parameter name="disableRestServiceDispatching" locked="false">true</parameter>
</transportReceiver>

<transportSender name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>

8280
真的
org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor
真的
真的

更改httpGetProcessor在这里没有帮助,您必须更改transportSender和transportReceiver配置。您可以注释掉现有的PTT transportSender/transportReceiver,并在axis2.xml文件上取消注释NHTTP transportSender/transportReceiver配置

这就是ESB 4.6.0上的功能

<transportSender name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>

<transportReceiver name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>       
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.PassThroughNHttpGetProcessor</parameter>      
</transportReceiver>

真的
8280
真的
org.wso2.carbon.transport.nhttp.api.passthroughntpGetProcessor
你需要的是

<transportReceiver name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOListener">
    <parameter name="port" locked="false">8280</parameter>
    <parameter name="non-blocking" locked="false">true</parameter>
    <parameter name="httpGetProcessor" locked="false">org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor</parameter>
    <parameter name="disableRestServiceDispatching" locked="false">true</parameter>
</transportReceiver>

<transportSender name="http" class="org.apache.synapse.transport.nhttp.HttpCoreNIOSender">
    <parameter name="non-blocking" locked="false">true</parameter>
</transportSender>

8280
真的
org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor
真的
真的

谢谢你的回答,萨加拉。如何通过SOAP头或主体进行调度?我应该使用其他交通工具吗?当我尝试在http侦听器设置中将“org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor”设置为httpGetProcessor时,会出现一个错误。谢谢您的回答,Sagara。如何通过SOAP头或主体进行调度?我应该使用其他交通工具吗?当我尝试在http侦听器设置中将“org.wso2.carbon.transport.nhttp.api.NHttpGetProcessor”设置为httpGetProcessor时,出现了一个错误。再次感谢。基于SOAP主体的分派可以很好地使用此配置。再次感谢您。基于SOAP主体的调度可以很好地使用此配置。