Design Automation for Revit调用SaveAsCloudModel遇身份验证异常求助
解决Revit Design Automation中调用SaveAsCloudModel的身份验证问题
问题核心
在Revit本地插件中正常运行的SaveAsCloudModel()功能,放到Design Automation环境中触发Autodesk.Revit.Exceptions.RevitServerUnauthenticatedUserException,提示需登录Autodesk 360。这是因为Design Automation是无头运行环境,没有本地用户的Autodesk登录上下文,必须通过服务端身份验证(2-legged token)授权访问BIM 360资源。
解决方案步骤
1. 配置Forge应用权限
- 确保你的Forge应用已启用BIM 360 API,并拥有
data:write、data:read等必要权限。 - 将Forge应用添加到目标BIM 360项目的成员列表中,分配至少能创建/修改云模型的权限(如项目管理员、文档编辑者)。
2. 修改Activity定义,添加身份验证参数
在Activity中新增authToken参数,用于传递2-legged访问令牌:
{ "id":"SaveModelTestActivity8", "commandLine": [ "$(engine.path)\\revitcoreconsole.exe /i \"$(args[rvtFile].path)\" /al \"$(appbundles[SaveModelTest8].path)\"" ], "parameters": { "rvtFile": { "zip": false, "ondemand": false, "verb": "get", "description": "Input Revit model", "required": true, "localName": "$(rvtFile)" }, "authToken": { "description": "2-legged access token for BIM 360 authentication", "required": true, "type": "string" }, "result": { "zip": false, "ondemand": false, "verb": "put", "description": "Results", "required": true, "localName": "result.rvt" } }, "engine": "Autodesk.Revit+2022", "appbundles": [ "SAVE_CLOUD_MODEL.SaveModelTest8+current" ], "description": "Save revit model to BIM 360 cloud" }
3. 更新Work Item,传入2-legged令牌
在Work Item的arguments中添加authToken参数,值为提前获取的有效2-legged访问令牌:
{ "activityId": "SAVE_CLOUD_MODEL.SaveModelTestActivity8+current", "arguments": { "rvtFile": { "url": "https://cdn.us.oss.api.autodesk.com/oss/v2/signedresources/372091ac-8274-4187-95f0-22414d21c9f2?region=US", "pathInZip": "MYFILE.rvt" }, "authToken": { "value": "YOUR_VALID_2_LEGGED_ACCESS_TOKEN" }, "result": { "verb": "put", "url": "https://cdn.us.oss.api.autodesk.com/oss/v2/signedresources/372091ac-8274-4187-95f0-22414d21c9f2?region=US" } } }
4. 在AppBundle代码中注入身份令牌
调用SaveAsCloudModel()前,通过Revit API设置云访问令牌:
// 从Work Item参数中获取authToken string authToken = args["authToken"].Value; // 设置Revit云身份验证令牌 Autodesk.Revit.DB.CloudUtility.SetCloudAccessToken(authToken); // 构建目标BIM 360云路径并保存 ModelPath cloudModelPath = ModelPathUtils.ConvertCloudGUIDsToCloudPath( new Guid("YOUR_BIM360_ACCOUNT_ID"), new Guid("YOUR_BIM360_PROJECT_ID"), new Guid("TARGET_FOLDER_ID"), "NEW_CLOUD_MODEL_NAME.rvt" ); document.SaveAsCloudModel(cloudModelPath);
关键注意事项
- 2-legged令牌的有效期为1小时,需确保Work Item提交时令牌未过期。
- 确认目标BIM 360文件夹的GUID正确,且Forge应用有权限访问该文件夹。
- Revit 2022及以上版本支持
CloudUtility.SetCloudAccessToken方法,低版本需使用对应兼容API。
内容的提问来源于stack exchange,提问作者Frank P Archi Dev
相关产品推荐
相关产品推荐

