1

IReliableDictionary に物を格納するステートフル サービスがあります。ローカル クラスターにデプロイした後、プライマリ ノードを再起動してフェールオーバーをテストしましたが、その後、コード StateManager.GetOrAddAsync>("MyDictionary") が FabricNotPrimaryException をスローし、その後の試行で FabricObjectClosedException をスローします。これをトラブルシューティングするために確認できることは何ですか?

4

1 に答える 1

1

このようなエラーをトラブルシューティングする基本的な方法は、スローされた例外をキャッチしてログに記録することです。

try
{
    using (var tx = StateManager.CreateTransaction())
    {
        await dictionary.AddOrUpdateAsync(tx, dto.Id, dto, (key, _) => dto);
        await transaction.CommitAsync();
    }
}
catch (FabricObjectClosedException ex)
{
    ServiceEventSource.Current.Message(ex.ToString());
    throw; // Pass the exception up as we only log it here.
}

ただし、問題は[DataContractAttribute]DTO クラスの欠落などの非常に単純なタイプミスである可能性があります。その場合、問題を簡単にデバッグして、問題をすばやく理解して修正する方が簡単な場合があります。これを行うには、System.Fabric.FabricObjectClosedExceptionVisual Studio に を追加し、デバッガーで「スロー時にブレーク」を有効にする必要があります。

  1. [例外設定]ウィンドウを表示します ( [デバッグ] > [ウィンドウ] > [例外設定] ) 。
  2. 例外カテゴリのリストで共通言語ランタイム例外カテゴリを選択します
  3. 緑色の+ (プラス) ボタンをクリックして、新しい例外の種類を追加します。
  4. テキスト ボックスに System.Fabric.FabricObjectClosedException と入力し、Enterキーを押します。

新しい例外の種類が追加されると、[スロー時にブレーク]チェック ボックスが既にオンになっています。

次にデバッガーでアプリケーションを実行すると、 a がスローされたときにデバッガーが壊れ、FabricObjectClosedException何が問題なのかを理解できるはずです。

于 2016-10-21T11:47:26.373 に答える