WCF客户端调用单向操作的问题

时间:2009-03-13 15:28:08

标签: wcf soap

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

单向操作返回了一条非空消息,其中包含Action =''

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


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

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

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

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

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


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

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

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

感谢您的任何建议。

5 个答案:

答案 0 :(得分:12)

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

this thread的一些选项:

  • 更改生成的代理并将OneWay = true(或添加OneWay = false)移至方法定义
  • 在异常处理程序中捕获协议违规并忽略它
  • 使用2.0风格的网络参考来调用服务
  • 应用SAP补丁Note 1459995 - Soap Sender Adapter HTTP 202并将& responsecode202 = true添加到网址

第一个也是最后一个选项对我有用。关于这个sap.com thread的进一步讨论。

答案 1 :(得分:4)

Gerben van Loon here我也会看一下这篇文章。根据标准,单向操作可能不是一种方式。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

答案 4 :(得分:0)

没有看到方法的签名是什么样的,我最好的猜测是你的方法被定义为返回“void”以外的东西。由于操作是单向的,因此只能使用“void”(没有返回)来定义方法。还有别的,而且操作不是单向的。