繁体   English   中英

防止来自WCF回调的异常

[英]Prevent Exceptions From WCF Callbacks

我正在制作一个小型聊天应用程序。 我到达了一个客户端发送消息的地步,然后通过使用会议室中其他客户端的回调,他们迅速接收到该消息。 因此,如果会议室中有10个人,则正在发送消息的客户端的服务实例将在10个线程中调用此实例:

targetCallback.RecieveMessage(message);

现在,Internet连接是易变的,很可能会在执行之前中断一会儿,因此会引发异常并自动销毁客户端实例,从而使消息未发送或未成功。

我发现示例根本无法真正处理这些异常,而其他示例则简单了:

try
{
    targetCallback.RecieveMessage(message);
}
catch
{
}

但是,这是处理此异常的最佳方法吗?

看到

http://msdn.microsoft.com/en-us/library/aa354510.aspx

寻求好的建议。 简要地说,您应该捕获TimeoutException和CommunicationException。

在调用WCF回调时,我也看到过ObjectDisposedExceptions,也许还有某种SecurityException,但是我不记得是哪一个。

对于需要更高可靠性的应用程序,我编写了一个基本的包装方法,该方法可以捕获所有异常并从您的回调集合中删除该回调。 然后,我只会通过包装调用回调。

通常,我还会从OperationContext中捕获有关连接的一些上下文信息,例如IP地址,sessionID和用户令牌,以便我可以识别出失败者并进行记录。 但这留给读者练习。

public interface ICallbackContract
{
    void Operation(string arg);
}

class Program
{
    private List<ICallbackContract> Callbacks;

    private void SendMessage(string msg)
    {
        lock (this.Callbacks)
        {
            foreach (var callback in this.Callbacks)
            {
                this.InvokeWcf(callback, (c) => c.Operation(msg));
            }
        }
    }

    public void InvokeWcf(this ICallbackContract contract, Action<ICallbackContract> op)
    {
        if (((ICommunicationObject)contract).State != CommunicationState.Opened)
        {
            lock (this.Callbacks)
                Callbacks.Remove(contract);
            myLogger.LogError("That contract isn't open! Disconnected.");
            return;
        }

        try
        {
            op(contract);
        }
        catch (TimeoutException ex)
        {
            lock (this.Callbacks)
                Callbacks.Remove(contract);
            myLogger.LogError("That contract timed out! Disconnected.", ex);
            return;
        }
        catch (CommunicationException ex)
        {
            ...
        }
        catch (ObjectDisposedException ex)
        {
            ...
        }
        catch (Exception ex)
        }
            // Unexpected case.
            lock (this.Callbacks)
                Callbacks.Remove(contract);
            myLogger.FatalError("Something really bad happened!.", ex);
            throw;
        {
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM