24

从我的 WCF 客户端调用 SAP PI 总线上的 Web 服务时遇到问题。操作定义为单向,我的代理操作合约上的方法在添加服务引用时进行了相应的修饰。但是,服务客户端在调用相应操作时会出现异常:

单向操作返回了一条带有 Action='' 的非空消息

使用 SoapUI,可以成功调用总线上的方法,并返回一个空主体的 SOAP 信封。巴士人员告诉我,这是根据 SOAP 规范:


(SOAP 规范,第 4.7.9 章,单向操作):

在执行单向操作时如何使用 HTTP 有不同的解释。

R2714对于单向操作,实例不得返回包含信封的 HTTP 响应。具体来说,HTTP 响应实体主体必须为空。

R2750消费者必须在单向操作中忽略 HTTP 响应消息中携带的信封。

R2727对于单向操作,消费者不得将成功的 HTTP 响应状态代码(即 2xx)解释为消息有效或接收者将处理它。


看来,我的 WCF 客户端不符合 R2750。

我发现当我强制代理上的操作合同为IsOneWay = false时,一切正常。

WCF 处理单向操作的方式有什么问题,还是我做错了什么(更有可能)?还有什么我应该做的吗,覆盖生成的 WCF 代理客户端似乎不正确。

感谢您的任何建议。

4

5 回答 5

16

看起来 SAP PI 错误地发送了一个空的 SOAP 信封,而 .NET 错误地解释了该信封。

该线程的一些选项:

  • 更改生成的代理并删除 OneWay=true(或添加 OneWay=false)到方法定义
  • 在异常处理程序中捕获协议冲突并忽略它
  • 使用 2.0 样式的 webreference 调用服务
  • 应用 SAP 补丁说明 1459995 - Soap Sender Adapter HTTP 202并将 &responsecode202=true 添加到 url

第一个和最后一个选项都对我有用。对此sap.com 线程的进一步讨论。

于 2013-02-13T18:29:24.520 回答
4

我也会在这里看看 Gerben van Loon 的这篇文章。根据标准,一种方式操作可能不是真正的一种方式。

于 2010-12-19T17:10:38.130 回答
1

检查此 SAP 线程以获取完整讨论: http ://scn.sap.com/thread/1627368

@Brian Low 已经正确且非常彻底地回答了这个问题(应该被标记为答案)。

我还想补充一点,这是一个已知错误,其中 SOAP 适配器不符合上述 WS-I Basic Profile 1.1 (R2750) 并且 WCF 不符合 (R2750)。结果......浪费了几个小时的时间和咬牙切齿......

于 2013-12-06T21:01:03.507 回答
0

我相信可以通过将以下属性声明添加到客户端 porxy 中的操作来解决此特定问题:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

于 2011-05-27T17:56:35.550 回答
0

在没有看到该方法的签名是什么样子的情况下,我最好的猜测是您的方法定义为返回“void”以外的内容。由于操作是单向的,方法只能使用“void”定义(没有返回)。其他任何事情,并且操作不是单向的。

于 2011-05-31T18:52:46.607 回答