You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历Service Fabric Actors时抛出InvalidCastException异常排查

问题分析与解决:Service Fabric Actor服务分区类型转换异常

问题场景

使用FabricClient QueryManager遍历所有分区以获取所有Actors列表时,本地集群运行正常,但Azure沙箱环境抛出InvalidCastException,错误信息:

Unable to cast object of type 'System.Fabric.SingletonPartitionInformation' to type 'System.Fabric.Int64RangePartitionInformation'.

相关代码如下:

public async Task<List<Store>> GetStores()
{
    var cancelToken = new CancellationToken(false);
    var fabricClient = new FabricClient();
    var actorServiceUri = new ServiceUriBuilder("StoreActorService").ToUri();
    var partitions = await fabricClient.QueryManager.GetPartitionListAsync(actorServiceUri);

    var actorIds = new List<ActorId>();
    foreach (var partition in partitions)
    {
        // 本地正常,Azure沙箱抛出转换异常
        var partitionInfo = (Int64RangePartitionInformation)partition.PartitionInformation;

        var actorServiceProxy = ActorServiceProxy.Create(
            actorServiceUri, 
            partitionInfo.LowKey);

        var continueToken = (ContinuationToken)null;
        do
        {
            var page = await actorServiceProxy.GetActorsAsync(continueToken, cancelToken);
            actorIds.AddRange(page.Items.Select(actor => actor.ActorId));
            continueToken = page.ContinuationToken;
        } while (continueToken != null);
    }

    var stores = new List<Store>();
    foreach (var actorId in actorIds)
    {
        var proxy = ActorProxy.Create<IStoreActor>(actorId, actorServiceUri);
        var store = await proxy.RetrieveAsync(actorId.ToString());
        stores.Add(store);
    }
    return stores;
}

已通过Service Fabric Explorer确认,服务配置为Int64Range分区。

可能原因

  1. 分区配置未完全生效:Azure环境中,服务分区配置变更后,旧的Singleton分区实例未彻底清理,或新的Int64Range分区未完成部署,导致FabricClient查询到旧数据。
  2. 服务URI指向错误:ServiceUriBuilder构造的URI可能指向了同名的Singleton分区服务,或存在命名空间冲突。
  3. FabricClient缓存问题:客户端内部缓存了旧的分区信息,未获取最新配置。
  4. 部署配置隐性错误:虽然Explorer显示为Int64Range,但实际部署的服务/应用清单中分区配置可能存在覆盖或错误。

解决方案

  1. 验证服务URI准确性:打印actorServiceUri的值,确认与Service Fabric Explorer中显示的服务URI完全一致,避免指向错误服务。
  2. 兼容分区类型处理:修改代码先判断分区类型,避免强制转换异常,同时排查异常分区来源:
    foreach (var partition in partitions)
    {
        if (partition.PartitionInformation is Int64RangePartitionInformation rangePartition)
        {
            var actorServiceProxy = ActorServiceProxy.Create(actorServiceUri, rangePartition.LowKey);
            // 原有查询逻辑
        }
        else if (partition.PartitionInformation is SingletonPartitionInformation)
        {
            // 记录日志,排查该分区来源,必要时手动删除残留分区
        }
    }
    
  3. 强制刷新查询结果:使用PartitionQueryDescription确保获取最新数据:
    var queryDesc = new PartitionQueryDescription(actorServiceUri);
    var partitions = await fabricClient.QueryManager.GetPartitionListAsync(queryDesc);
    
  4. 核对部署配置:重新检查应用程序清单和服务清单,确认PartitionScheme设置为Int64Range,且部署时未使用旧配置包覆盖。
  5. 清理残留分区:在Service Fabric Explorer中检查是否存在该服务的Singleton分区实例,若有则手动删除,等待服务重新部署生效。

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:05:20