如何通过APS从ACC获取Revit文件的Workitem?求助.NET示例
从ACC获取Revit文件并创建Design Automation Workitem(.NET示例)
核心问题分析
你需要直接从ACC文件的URN(格式如urn:adsk.wipprod:fs.file:vf.rXJhqUE6QamM6ANpG2Qz6w?version=1)获取文件,用于Design Automation的Workitem,而非本地上传流程。现有代码的问题在于直接携带AccessToken的URL无法被Design Automation服务识别,且URN解析逻辑可优化。
正确实现步骤及代码示例
1. 解析ACC文件URN并获取OSS预签名URL
Design Automation不支持带Bearer Token的OSS访问,需通过API获取文件的预签名下载URL,以下是优化后的获取逻辑:
using Autodesk.Forge; using Autodesk.Forge.DesignAutomation.Model; using Autodesk.Forge.Model; using System.Linq; [TestCase("b.ca790fb5-141d-4ad5-b411-0461af2e9748", "urn:adsk.wipprod:fs.file:vf.rXJhqUE6QamM6ANpG2Qz6w?version=1")] public async Task GetAccFileForDesignAutomation(string projectId, string versionUrn) { // 初始化版本API客户端 var versionsApi = new VersionsApi(); versionsApi.Configuration.AccessToken = Token; // 获取版本的存储关系ID var version = await versionsApi.GetVersionAsync(projectId, versionUrn); var storageId = version.Data.Relationships.Storage.Data.Id; // 解析存储ID为bucketKey和objectName var storageParts = storageId.Split('/'); var bucketKey = storageParts[^2].Split(':').Last(); var objectName = storageParts[^1]; // 获取预签名下载URL(有效期30分钟,无需携带Token) var objectsApi = new ObjectsApi(); objectsApi.Configuration.AccessToken = Token; var signedUrl = await objectsApi.CreateSignedResourceAsync( bucketKey, objectName, new PostBucketsSigned(30), "read" ); // 构建Design Automation可用的输入参数 var inputArgument = new XrefTreeArgument { Url = signedUrl.SignedUrl, Verb = Verb.Get }; // 后续将inputArgument用于Workitem的Inputs配置 }
2. 完整Workitem提交示例
拿到有效输入URL后,结合输出配置提交Workitem:
public async Task SubmitRevitWorkitem(string inputFileUrl, string outputBucketKey, string outputFileName) { var designAutomationApi = new DesignAutomationClient(); designAutomationApi.Configuration.AccessToken = Token; // 获取Revit引擎别名(示例为2025版,可按需替换) var engineAlias = await designAutomationApi.GetEngineAliasAsync("Autodesk.Revit+2025"); // 定义Workitem的输入输出参数 var workitem = new WorkItem { ActivityId = "YourCustomRevitActivityId", // 替换为你的自定义Activity ID Arguments = new Dictionary<string, IArgument> { { "inputFile", new XrefTreeArgument { Url = inputFileUrl, Verb = Verb.Get } }, { "outputFile", new XrefTreeArgument { Url = await GetSignedUploadUrl(outputBucketKey, outputFileName), Verb = Verb.Put } } }, Engine = engineAlias.Id }; // 提交Workitem到Design Automation服务 var submittedWorkitem = await designAutomationApi.CreateWorkItemAsync(workitem); } // 辅助方法:获取输出文件的预签名上传URL private async Task<string> GetSignedUploadUrl(string bucketKey, string fileName) { var objectsApi = new ObjectsApi(); objectsApi.Configuration.AccessToken = Token; var signedUrl = await objectsApi.CreateSignedResourceAsync( bucketKey, fileName, new PostBucketsSigned(30), "write" ); return signedUrl.SignedUrl; }
3. 关键注意事项
- 预签名URL权限:输入文件用
read权限,输出文件用write权限,有效期建议设置15-60分钟。 - Activity匹配:Workitem的参数名称需与自定义Activity的输入输出参数完全一致。
- Token权限:调用API的Token需包含
data:read、data:write、bucket:read、bucket:write、code:all权限。
原有代码问题点
- 直接在XrefTreeArgument中携带Bearer Token:Design Automation无法识别该方式,必须使用预签名URL。
- 存储ID解析逻辑冗余:可通过C#索引器简化代码,提升可靠性。
- 缺少Workitem提交环节:仅构建URL未完成完整的Workitem定义与提交流程。
内容的提问来源于stack exchange,提问作者chuongmep
相关产品推荐
相关产品推荐

