当我从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代理客户端似乎不对。
谢谢你的建议。
看起来SAP PI错误地发送了一个空的SOAP信封,而.NET错误地解释了这个信封。
一些选项来自 这条:
第一个和最后一个选项都对我有效。关于这个问题的进一步讨论 sap.com线程.
我也想看看Gerben van Loon的这篇文章。此处. 根据标准,单向操作可能不是真正的单向。
查看SAP的这个帖子,了解完整的讨论。http:/scn.sap.comthread1627368。
@Brian Low 正确且彻底地回答了这个问题(应该被标记为答案)。
我还想补充一下,这是一个已知的错误,其中SOAP适配器不符合上述WS-I Basic Profile 1.1(R2750),WCF也不符合(R2750)。其结果是... 浪费了几个小时的时间,咬牙切齿......。
我相信这个特殊的问题可以通过在客户端porxy的操作中添加以下属性声明来解决。
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
在没有看到方法的签名的情况下 我猜测你的方法定义的是返回 "void "以外的内容 由于操作是单向的,所以只能使用 "void"(没有返回)来定义方法。 其他的东西,操作就不是单向的。