簡體   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