我有以下WCF协议桥接方案:使用basicHttp绑定的WCF客户端与路由服务通信,路由服务使用netTcp将请求转发给服务。
客户< - > basicHttpBinding (SOAP 1.1)
< - > 路由器服务< - > netTcpBinding (SOAP 1.2)
< - >的服务
路由功能完美无缺,直到我们将服务公开给使用gSOAP库将消息传递给服务的C ++客户端。如果C ++客户端直接与服务通信,则调用成功;但是,一旦尝试通过路由服务进行通信,它就会失败。
服务接收路由消息,但在尝试反序列化消息时会立即抛出异常。从服务返回的错误消息是System.ServiceModel.Dispatcher.NetDispatcherFaultException
,表示"The formatter threw an exception while trying to deserialize the message…"
该问题似乎是由协议桥接引起的。如果我不使用协议桥接,即我在整个调用链中使用basicHttp,则C ++客户端(和消息路由)按预期工作。
我无法弄清楚如何解决此问题。我理解路由服务被设计为WCF到WCF中介,但问题似乎只与源自C ++ gSOAP客户端的调用隔离。我已经尝试使用一些Web服务测试工具(soapUI,soapSonar)来查看我是否可以复制该问题,但它们似乎工作正常。 任何帮助或指导都将不胜感激。
此致 史蒂夫
答案 0 :(得分:2)
在联系Microsoft并获得Yaron Naveh的帮助后,结果发现这是WCF路由服务中的未经证实的错误。有关问题发生原因的详细信息,Yaron有一篇很好的博客文章,详细描述了这个问题。
http://webservices20.blogspot.com/2011/01/gsoap-and-wcf-routing-services-are-not.html
感谢所有帮助澄清此问题的人!
此致
史蒂夫
更新(04/03/2011): Microsoft已针对此问题发布了修复程序。 http://connect.microsoft.com/VisualStudio/feedback/details/640260/wcf-routing-services-creates-wrong-message-when-protocol-bridging-is-used
答案 1 :(得分:0)
使用具有不同传入和传出绑定的任何RPC编码的SOAP消息时,也会发生此问题。与类型定义关联的名称空间引用在转换中丢失。我们创建了一个服务行为扩展,它手动添加了命名空间引用。这不是理想的,但我们无法改变绑定。我们已经非正式地向Microsoft报告了这个问题。
祝你好运