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

问题描述 投票:22回答:5

当我从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代理客户端似乎不对。

谢谢你的建议。

wcf soap sap sap-xi sap-pi
5个回答
15
投票

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

一些选项来自 这条:

  • 改变生成的代理,并在方法定义中删除OneWay=true(或添加OneWay=false)。
  • 在异常处理程序中捕获协议违反并忽略它。
  • 使用一个2.0风格的webreference来调用该服务
  • 打补丁 注 1459995 - Soap Sender Adapter HTTP 202。 并将&responsecode202=true添加到url中

第一个和最后一个选项都对我有效。关于这个问题的进一步讨论 sap.com线程.


4
投票

我也想看看Gerben van Loon的这篇文章。此处. 根据标准,单向操作可能不是真正的单向。


1
投票

查看SAP的这个帖子,了解完整的讨论。http:/scn.sap.comthread1627368。

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

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


0
投票

我相信这个特殊的问题可以通过在客户端porxy的操作中添加以下属性声明来解决。

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]


0
投票

在没有看到方法的签名的情况下 我猜测你的方法定义的是返回 "void "以外的内容 由于操作是单向的,所以只能使用 "void"(没有返回)来定义方法。 其他的东西,操作就不是单向的。

© www.soinside.com 2019 - 2024. All rights reserved.