簡體   English   中英

我應該如何處理從WCF回調接口對象集合之一引發的異常?

[英]How should I handle exceptions thrown from one of a collection of WCF callback interface objects?

更新:自從寫了這個問題以來,我遇到了這個錯誤報告 ,該報告提供了一種復制我一直看到的錯誤症狀的方法。

我還不能確定這是否是我遇到錯誤的原因,但值得進行一些調查。 我還沒有找到報告中描述的錯誤的解決方法。

總結報告:如果WCF客戶端在WCF服務進行身份驗證期間關閉,則會在服務處引發異步異常,在我看來,該異常不會被捕獲,直到到達program.cs文件為止,因此很難處理優雅地。

原始問題:

我在Windows服務中托管了WCF服務。

WCF服務允許客戶端進行訂閱(提供回調),此后,該服務將更新發布到所有訂閱者。

該服務維護所有當前訂戶的回調接口的Dictionary<int, ICallback>

當發生事件要求發布信息時,服務將遍歷集合並調用ICallback中定義的適當方法。

這一切都很好,並且在所有情況下,使用ICallback對象的情況都會被包裹在try catch中,以防對象處置異常和可能發生的任何其他異常。

我遇到的問題是在服務處引發了通信異常:

System.ServiceModel.CommunicationException:

套接字連接已中止。 這可能是由於處理您的消息時出錯,遠程主機超出了接收超時或潛在的網絡資源問題引起的。

本地套接字超時為'10675199.02:48:05.4775807'。

System.IO.IOException:讀取操作失敗,請參閱內部異常。

System.ServiceModel.CommunicationException:套接字連接已中止。 這可能是由於處理您的消息時出錯,遠程主機超出了接收超時或潛在的網絡資源問題引起的。

本地套接字超時為'10675199.02:48:05.4775807'。

System.Net.Sockets.SocketException:現有連接被遠程主機強行關閉

未捕獲此異常,並導致應用程序崩潰。

因為沒有被捕獲,所以我假設在服務試圖發布數據的時候沒有拋出異常,因為這總是在try-catch中發生。

客戶端應用程序錯誤地關閉通道/套接字會導致此異常嗎?

更重要的是,當正在運行的線程中當前未訪問異常源的對象時,如何捕獲以這種方式引發的異常?

即,拋出異常時,ICallback對象位於字典中,而不被使用-那么如何處理異常? 我該放在哪里?

WCF服務訂閱方法

public static int Subscribe()
{
    int id = -1;

    OperationContext currentContext = OperationContext.Current;

    if (currentContext != null)
    {
        ICallback callback = currentContext.GetCallbackChannel<ICallback>();

        if (callback != null)
        {
            id = GetNextId();

            lock (SubscriberLock)
            {
                Subscribers.Add(id, callback);
            }
        }
    }
    return id;
}

此方法完成后的一段時間會引發異常。

我已經很清楚地解釋了這個問題,對此我並不感到十分高興,因此請澄清一下是否有明確的問題。

謝謝!

通信異常將在客戶端而不是WCF端拋出。 通過將其包裝在try and catch中,可以在客戶端捕獲通信異常。 CommunicationException是在wcf生成的所有異常的基本類型。 您還應該將日志記錄添加到wcf服務和客戶端。 有關如何在此處添加日志記錄的詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM