WCF 双工合同

Posted

技术标签:

【中文标题】WCF 双工合同【英文标题】:WCF Duplex Contract 【发布时间】:2011-07-16 07:33:50 【问题描述】:

假设我有这样的 WCF 服务合同

[ServiceContract(CallbackContract = typeof(ICallback1),
SessionMode = SessionMode.Required)]
public interface IService1

  // some methods

服务实现将InstanceContextMode.Single 设置为InstanceContextMode ICallback1 类似于

public interface ICallback1

    [OperationContract]
    void Report(int someValue);

现在在客户端,我可以有一个类来实现 ICallback1 像

class Callback1 : ICallback1

    public void Report(int someValue)
    
        // alert client
    

我像这样创建客户服务参考

Service1Client serviceClient = new Service1Client(new InstanceContext(new CallBack1())); 

效果很好。现在的问题是我有一些客户端对回调不感兴趣所以我认为我不需要为这些客户端实现回调接口所以我尝试了这个

 Service1Client serviceClient = new Service1Client(null);

 Service1Client serviceClient = new Service1Client(new InstanceContext(null));

两者都报告了parameter cannot be null。我的问题是,如果客户端对回调不感兴趣,我如何在不传递回调对象的情况下创建服务引用。唯一的要求是所有客户端都应该与同一个服务通信,否则我可以重组服务。有什么想法吗?

编辑:

我也尝试使用 SessionMode = SessionMode.Allowed 代替 SessionMode.Required 使用 ServiceContract,但这也没有帮助。

【问题讨论】:

只要是合同的一部分,看起来就不可能。 CallbackContract 可以是可选的吗? 简单来说,Callback被定义为Service Contract的一部分,这是不变的。配置其他所有内容不会更改合同,因此看起来不可能。 【参考方案1】:

解决方法:从 IService1 中删除 CallbackContract。创建继承 IService1 并包含 CallbackContract 的 IDuplexService1。让 Service1Client 实现 IDuplexService1。实例化主机时,为 IService1 和 IDuplexService1 调用 ServiceHost.AddServiceEndpoint

【讨论】:

以上是关于WCF 双工合同的主要内容,如果未能解决你的问题,请参考以下文章

通过 WCF 双工通道长期运行的回调合同 - 替代设计模式?

如何在双工回调中读取 WCF 消息头?

WCF 双工服务和 TCP 端口耗尽

WCF - 使用完全相同的数据合同的多个服务合同

WCF - 在合同列表中找不到合同名称

找不到 WCF 合同名称“IMyService”?