Wcf IErrorHandler接口让我困惑

Wcf IErrorHandler接口让我困惑,wcf,exception-handling,soapfault,ierrorhandler,Wcf,Exception Handling,Soapfault,Ierrorhandler,我创建了一个实现IErrorHandler和IServiceBehavior的类。我将该行为添加到我的ServiceHost并运行它 我之所以开始尝试了解IErrorHandler,是因为我不得不将与回调通道接口的所有服务代码包装在try-catch语句中,并想知道是否有一种全局方法来捕获异常 从我在StackOverflow上读到的内容来看,这确实是我想要的东西 然而,在执行过程中,这让我非常困惑。如果我有一个合同的方法,做以下 Dictionary<IChatCallback,

我创建了一个实现IErrorHandler和IServiceBehavior的类。我将该行为添加到我的ServiceHost并运行它

我之所以开始尝试了解IErrorHandler,是因为我不得不将与回调通道接口的所有服务代码包装在try-catch语句中,并想知道是否有一种全局方法来捕获异常

从我在StackOverflow上读到的内容来看,这确实是我想要的东西

然而,在执行过程中,这让我非常困惑。如果我有一个合同的方法,做以下

    Dictionary<IChatCallback, string> userChannels = new Dictionary<IChatCallback, string>();

    public void SendMessage(string message)
    {
        IChatCallback callback = OperationContext.Current.GetCallbackChannel<IChatCallback>();
        string senderName = userChannels[callback];

        SendMessageToAllUsers(message, senderName);
    }

    public void SendMessageToAllUsers(string message, string sender)
    {
        foreach (var userChannel in userChannels.Keys)
        {
            userChannel.ReceiveMessage(new ChatMessage(message, sender));
        }
    }

我是否只需要进入我所有的方法,检查频道是否关闭或出现故障,并将所有内容包装在try/catch块中,以删除引用并通知客户?

我感觉到了您的痛苦。如果你碰巧在整个主题上有任何主要的灯泡,不要急于发表你的发现。我也处在一个类似的位置——我真的很想利用WCF,但当我看到一些示例和解决方案时,我真的渴望简单/清晰,因为它们涉及到错误处理和诊断。如果我正在编写ServiceHost,我会给它一个未处理的异常事件,并使用一些参数为客户端重新打包异常。我觉得实现接口和将接口连接到主机的某个隐藏子部分的所有复杂性都指向了未完成的工作(我会尽量记住发布我遇到的任何可以简化它的内容)。
        IChatCallback callback = OperationContext.Current.GetCallbackChannel<IChatCallback>();
        ICommunicationObject callbackComm = (ICommunicationObject) callback;
        callbackComm.Faulted += (sender, e) =>
            {
                lock (lockObject)
                {
                    string name = userChannels[callback];
                    userChannels.Remove(callback);
                    NotifyOfUserDisconnect(name);
                }
            };