0

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

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

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

4

2 回答 2

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 accessesing published WS proxy in WSO2 ESB 4.6: EPR not found

于 2013-03-23T12:40:55.273 回答
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>
于 2013-03-25T15:11:56.267 回答