第一个body子元素的QName不调度SOAP请求

时间:2013-03-22 11:05:42

标签: web-services soap wsdl wso2 wso2esb

我有一个用WSDL描述的服务。当使用此request调用其操作createService时,一切都很好。对于此服务,已在WSO2 ESB 4.6.0上进行代理服务。 Here是ESB为代理服务生成的WSDL。当我尝试使用soapUI向代理服务发送相同的请求时,会发生以下错误:

  

未找到操作的端点引用(EPR)是   /services/test.testHttpSoap11Endpoint和WSA Action =。如果这   EPR以前可以访问,请联系服务器管理员。

使用ESB的代理服务测试工具发送此请求的正文我没有问题。我想是因为这个工具使用WS-Addressing来发送它。如果端点URL由?createRequest附加,则还可以使用soapUI顺利发送请求。根据这个article,问题的原因是SOAPMessageBodyBasedDispatcher。由于某种原因,它无法通过SOAP body元素的第一个子元素的QName识别目标操作。但我无法理解为什么SOAPMessageBodyBasedDispatcher在我的情况下搞砸了。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

WSO2 ESB 4.6.0和早期版本之间的主要区别是WSO2 ESB 4.6.0默认启用直通传输(PTT)。 PTT用于在WSO2 ESB中实现非常高的性能提升,您可以在http://wso2.org/library/articles/2013/01/esb-performance-65找到一些数字。

您的用例的主要问题是它期望SOAPMessageBodyBasedDispatcher分派操作名称。 SOAPMessageBodyBasedDispatcher构建消息并使用第一个子节点的本地名称来调度此操作被认为是非常昂贵的,因此目前在PPT中不支持。目前,您可以将预期的SOAPAction作为HTTP标头发送,以解决此问题。在这个帖子中,我提供了一些其他解决方案Error accesing published WS proxy in WSO2 ESB 4.6: EPR not found

答案 1 :(得分:2)

更改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>

您需要的是

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