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.FabricObjectClosedException到 Visual Studio,然后在调试器中启用“抛出时中断”:

  1. 显示异常设置窗口(调试> Windows >异常设置
  2. 在异常类别列表中选择Common Language Runtime Exceptions类别
  3. 单击绿色+(加号)按钮添加新的异常类型
  4. 在文本框中键入System.Fabric.FabricObjectClosedException并按Enter

添加新异常类型时,已选中“抛出时中断”复选框。

下次您在调试器中执行应用程序时,调试器将在FabricObjectClosedException抛出 a 时中断,您应该能够理解出了什么问题。

于 2016-10-21T11:47:26.373 回答