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

调用GetUserWorksetInfo获取BIM360模型工作集信息偶发报错

问题背景

开发过程中调用Autodesk.Revit.DB.WorksharingUtils.GetUserWorksetInfo(ModelPath)方法获取模型工作集列表,该方法在本地服务器、Revit Server项目场景下已稳定运行多年。今年新增BIM 360模型链接相关功能后,查询目标为BIM 360平台内的模型时,方法偶发执行失败,无报错的成功场景可正常走完流程,通过Revit日志文件可定位故障触发点为上述方法。
目前已初步猜测故障与时序问题、BIM 360端文件在同步/关闭等前置操作后未完成全量更新有关,曾尝试在程序中增加等待延时,未解决问题。

核心实现逻辑
' 打开宿主模型
aDoc = OpenCloudModelWithCallback(mApp, modelPath)

' 开启事务
Dim mTransaction As New Transaction(aDoc)
mTransaction.Start("Linking Models")

' Revit Server和BIM 360均不支持相对路径
Dim linkOptions As New RevitLinkOptions(True)
linkOptions.IsRelative = False

' FileInfo为本地自定义类,用于存储Revit模型相关信息
For Each f As FileInfo In LinkList

' 不加载"共享标高和轴网"工作集
  Dim linkedWorksets As IList(Of WorksetPreview) = WorksharingUtils.GetUserWorksetInfo(f.Modelpath)

  Dim worksetIds As IList(Of WorksetId) = New List(Of WorksetId)()
    ' 遍历筛选需要打开的工作集
    For Each worksetPrev As WorksetPreview In linkedWorksets
      If worksetPrev.Name.CompareTo("Shared Levels and Grids") <> 0 Then
        worksetIds.Add(worksetPrev.Id)
      End If
    Next

  Dim linkWorksetConfig As New WorksetConfiguration(WorksetConfigurationOption.CloseAllWorksets)
  linkWorksetConfig.Open(worksetIds)
  linkOptions.SetWorksetConfiguration(linkWorksetConfig)

  ' 链接BIM 360模型
  linkResult = RevitLinkType.Create(aDoc, f.Modelpath, linkOptions)

Next

' 提交事务
mTransaction.Commit()
偶发错误的可能原因
  • BIM 360分布式架构的元数据同步延迟:和本地部署、内网运行的Revit Server不同,BIM 360的模型元数据(含工作集信息)是多节点分布式存储的,同步为异步执行。GetUserWorksetInfo调用时如果本地协作缓存、BIM 360边缘节点、中心存储三者的元数据版本不一致,就会触发调用失败,固定时长的延时无法覆盖边缘节点同步的随机波动。
  • 事务内调用云接口触发限流/锁冲突:当前代码在已启动的活动事务内循环调用GetUserWorksetInfo拉取外链模型的工作集信息,事务持有宿主模型的写锁时,Revit云协作模块会限制并发云元数据请求的配额,短时间批量发起请求时很容易触发限流,导致偶发失败。
  • 瞬态异常无重试逻辑:BIM 360基于公网提供服务,本身就存在丢包、瞬态超时、服务临时不可用的情况,这类异常在内网的本地/Revit Server场景下出现概率极低,因此原有代码没有做容错,公网场景下就会表现为偶发失败。
  • 模型路径/权限状态异常:如果传入的ModelPath对应模型的历史版本、刚被其他用户移动/删除/权限调整,或是用户对目标模型的查看权限刚被授予还未同步到所有节点,GetUserWorksetInfo不会做自动重试,会直接抛出错误,这类场景在多人协作的云项目中出现概率远高于本地Revit Server。
  • 本地协作缓存损坏:Revit会在本地存储BIM 360模型的协作缓存,如果缓存中的元数据文件损坏,也会偶发导致工作集信息读取失败。
故障排查与修复方案
  • 先明确错误详情:不要仅靠日志定位触发方法,给GetUserWorksetInfo调用增加独立的try-catch块,捕获异常时完整记录异常类型、错误信息、失败模型对应的项目GUID、模型GUID、版本号,先区分错误是权限问题、网络问题、元数据不存在还是版本不匹配问题,避免盲目调整。
  • 调整代码执行顺序:将所有待链接模型的工作集信息拉取操作,全部移到事务启动之前执行。不要在持有事务写锁的阶段发起任何云模型元数据请求,提前批量拉取完所有模型的工作集配置后,再启动事务执行链接创建操作,规避事务锁导致的云请求限流。
  • 增加退避重试逻辑:替换原有的固定时长等待,针对GetUserWorksetInfo的瞬态错误(网络超时、服务临时不可用、元数据版本不匹配),按照1s/3s/5s的间隔最多重试3次;重试前先调用ModelPathUtils.ValidateCloudModelPath校验云路径有效性,同时主动触发本地云缓存刷新。
  • 统一使用最新发布版本的模型路径:不要直接传入存储的历史ModelPath,调用GetUserWorksetInfo前先将路径转换为目标模型最新已发布版本对应的云路径,避免读取未完全提交的工作集版本、或已失效的历史版本元数据。
  • 增加缓存容错逻辑:重试多次仍失败时,可自动清理当前用户对应模型的Revit协作缓存(路径为%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit [对应版本号]\CollaborationCache)后再尝试调用,排除本地缓存损坏导致的读取失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:24:29