【问题标题】:how to detect if client is alive for callback in wcf?如何检测客户端是否在 wcf 中进行回调?
【发布时间】:2012-04-21 14:38:28
【问题描述】:

我有一个 WCF 实现,并将其托管在 Windows 服务中(自托管)。我使用回调合约来触发客户端的一些事件。
问题是我如何确定或检查客户端是否仍然活着以触发其回调事件。有没有检查机制?我使用.NET 3.5。
谢谢。

【问题讨论】:

    标签: wcf wcf-client


    【解决方案1】:

    没有任何内置方法。

    如果客户端无法处理回调,那么您的服务将在尝试调用客户端回调时挂起或抛出异常(取决于回调通道的状态)。

    这个问题的一个可能的解决方案是here

    【讨论】:

    • 我想优雅地检测它。我不想让它依赖于抛出的异常。我可以将回调合约转换为 ICommunicationObject 然后检查它的状态吗?行得通吗?
    • 很抱歉我不知道这个问题的答案。
    • 谢谢@hugh。我将使用将 CallbackContract 强制转换为 ICommunicationObject 并检查其状态是否打开。顺便说一下,我们会找到更好的解决方案。
    【解决方案2】:

    我解决相同问题的方法是创建一个“DefaultCallback”类,它实现回调接口并且什么都不做(它当然不会抛出任何 Not ImplmentedException)。 然后你可以写一点这样的代码:

        private IServiceCallBack[] GetCallBack()
        {
            var returnValue = new IServiceCallBack[1];
    
            var com = (ICommunicationObject)(returnValue[0] = OperationContext.Current.GetCallbackChannel<IServiceCallBack>());
    
            com.Closing += new EventHandler((object sender, EventArgs e) =>
            {
                returnValue[0] = new DefaultCallBack();
            });
    
            com.Faulted += new EventHandler((object sender, EventArgs e) =>
            {
                returnValue[0] = new DefaultCallBack();
            });
    
            return returnValue;
        }
    

    因此,每当回调客户端处于关闭或故障状态时,它都会被一个不执行任何操作的兼容对象替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多