使用NetTcpBinding进行双工通信 – ContractFilter不匹配?

我正在使用NetTcpBinding在客户端和服务器之间打开双工通信通道方面取得缓慢而稳定的进展。 (仅供参考,你可以在这里和这里观察我的新手进展!)

我现在处于通过服务器防火墙成功连接到服务器的阶段,客户端可以向服务器发出请求。

然而,在另一个方向,事情并不那么幸福。 它在我自己的机器上测试时工作正常,但是当通过互联网进行测试时,当我尝试从服务器端发起回调时,我收到一个错误:

The message with Action 'http://MyWebService/IWebService/HelloWorld' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, eg Message, Transport, None). 

以下是代码的一些关键部分。 一,网页界面:

 [ServiceContract(Namespace = "http://MyWebService", SessionMode = SessionMode.Required, CallbackContract = typeof(ISiteServiceExternal))] public interface IWebService { [OperationContract] void Register(long customerID); } public interface ISiteServiceExternal { [OperationContract] string HelloWorld(); } 

这是IWebService的实现:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] class WebService : IWebService { void IWebService.Register(long customerID) { Console.WriteLine("customer {0} registering", customerID); var callbackService = OperationContext.Current.GetCallbackChannel(); RegisterClient(customerID, callbackService); Console.WriteLine("customer {0} registered", customerID); } } 

然后,在客户端(我正在摆弄这些属性而不知道我在做什么):

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, Namespace="http://MyWebService")] class SiteServer : IWebServiceCallback { string IWebServiceCallback.HelloWorld() { return "Hello World!"; } ... } 

那么我在这里做错了什么?

编辑:添加app.config代码。 从服务器:

                                 

在客户端:

                    

感谢@Allon Guralnek,他帮我注意到了什么错误:

在服务器端我有:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] class WebService : IWebService { ... } 

在客户端我有:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, Namespace="http://MyWebService")] class SiteServer : IWebServiceCallback { ... } 

冲突发生在PerSessionPerSession之间。 我刚刚将服务器端更改为PerSession ,而 – 休斯顿,我们已经升空了!

现在,为了使安全性得以实现……请观看我的WCF学习曲线中的下一个令人兴奋的分期付款! 🙂

您将回调合约列为ISiteServiceExternal但您的客户端实现了IWebServiceCallback 。 首先解决问题,看看你是否成功。