从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代理客户端似乎是不对的。
感谢您的任何建议。
答案 0 :(得分:12)
看起来SAP PI错误地发送了一个空的SOAP信封,并且.NET错误地解释了该信封。
this thread的一些选项:
第一个也是最后一个选项对我有用。关于这个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”(没有返回)来定义方法。还有别的,而且操作不是单向的。