识别 WCF 服务中的客户端

Posted

技术标签:

【中文标题】识别 WCF 服务中的客户端【英文标题】:Identifying clients in a WCF service 【发布时间】:2011-11-09 08:25:08 【问题描述】:

我有一个使用 WSDualHttpBinding 的双工 WCF 服务。我的问题是找出一种方法来存储具有唯一 ID 的回调通道。该服务旨在长期运行。我可以在调用“订阅”方法时简单地获取OperationContext.Current.GetCallbackChannel() 返回值并将其存储在列表或字典中吗?是否保证在连接有效之前有效?

【问题讨论】:

【参考方案1】:

最简单的方法是让客户端在您的服务的订阅方法中提交一个键值。然后,您可以将回调通道保存在字典中。这个字典可能需要是一个静态变量或单例类,其生命周期大于服务类的生命周期,因为大多数服务类都有一个 PerCall 生命周期并在服务调用完成后被处理掉。当心线程问题!

回调通道随时可能在客户端或服务端出现故障。该服务必须处理故障通道的可能性并从字典中删除故障通道。 WSDuallHttpBinding 是一个“无状态”绑定,因此在服务端尝试调用它们之前,不会在服务端检测到客户端中的任何故障。如果客户端进入故障状态,NetTcpBinding 将引发 ChannelFaulted 事件。因此,如果它符合您的要求,我会推荐 NetTcpBinding。

public bool Subscribe(string id) 
        ICallback callback = OperationContext.Current.GetCallbackChannel();
        if (!_activeCallbackChannels.Contains(id)) 
            _activeCallbackChannels.Add(id, callback);
            return true;
        
        else 
            return false;
        

    

【讨论】:

以上是关于识别 WCF 服务中的客户端的主要内容,如果未能解决你的问题,请参考以下文章

根据 WCF 服务中发布的 xml 内容识别操作,而不在 Url 中包含操作名称

WCF 服务默认是无状态的吗?

WCF分布式4:客户端访问寄宿在IIS中的WCF服务

如何在 Restful WCF 服务中管理会话

WCF 服务中的 SignalR 用于更新网站客户端

WCF 服务中的自定义证书验证