2

更新:この質問を書いて以来、一貫して見ているバグの症状を再現する方法を提供するこのバグレポートに 出くわしました。

これが私が経験しているバグの原因であるかどうかはまだ確認できませんが、何らかの調査が必要です. レポートに記載されているバグの回避策をまだ見つけていません。

レポートを要約すると、WCF サービスでの認証中に WCF クライアントが閉じると、サービスで非同期例外がスローされます。これは (私の場合) program.cs ファイルに到達するまでキャッチされないため、処理が困難になります。優雅に。

元の質問:

Windows サービス内でホストされている WCF サービスがあります。

WCF サービスを使用すると、クライアントは (コールバックを提供して) サブスクライブできます。その後、サービスはすべてのサブスクライバーに更新を発行します。

Dictionary<int, ICallback>このサービスは、現在のすべてのサブスクライバーのコールバック インターフェイスを維持します。

情報の公開を必要とするイベントが発生すると、サービスはコレクションをループし、ICallback で定義された適切なメソッドを呼び出します。

これはすべて正常に機能し、ICallback オブジェクトが使用されるすべての場合は、オブジェクトが破棄された例外やその他の例外が発生した場合に備えて、try キャッチにラップされます。

私が抱えている問題は、サービスで通信例外が発生していることです。

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 オブジェクトは使用されずに辞書に格納されます。try catch はどこに置くのですか?

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;
}

このメソッドの完了後、しばらくすると例外がスローされます。

問題を非常に明確に説明したことに満足していないので、明確でない特定の点がある場合は明確化を求めてください.

ありがとう!

4

1 に答える 1

0

通信例外は、WCF 側ではなくクライアント側でスローされます。トライアンドキャッチ内にラップすることで、クライアント側で通信例外をキャッチできます。CommunicationException は、wcf で生成されるすべての例外の基本型です。wcf サービスとクライアントにもロギングを追加する必要があります。ログを追加する方法の詳細はこちら。

于 2012-07-02T13:10:25.830 に答える