调用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
相关产品推荐
相关产品推荐

