APS/Forge临时S3上传URL过期求助:突破60分钟限制
解决Autodesk Platform Services中Design Automation输出URL过期问题(处理时长超60分钟)
问题背景
在Autodesk Platform Services(原Forge)运行Design Automation应用时,部分文件处理耗时超过60分钟,导致提前生成的S3上传URL在结果产出后过期,最终上传失败。已经将S3UploadURL的minutesExpiration设为最大值60,但仍无法满足需求。由于必须预先把输出URL传入workItem,没法通过后续重新获取URL的方式规避过期问题。
原代码片段:
//POST Get temporary Upload URL var objectsApiInstance3 = new ObjectsApi(); Dictionary<string, object> opts = new Dictionary<string, object>(); opts.Add("minutesExpiration", 60); var uploadCsvResponse = objectsApiInstance3.getS3UploadURLAsync(urnOutputBucket, urnOutputObjectKey, opts); dynamic uploadCsv = JsonConvert.DeserializeObject<Dictionary<string, object>>(uploadCsvResponse.Result.ToString()); string uploadUrl = ""; string outputUploadKey = ""; foreach (var e in uploadCsv) { if (e.Key == "urls") { uploadUrl = e.Value[0]; } if (e.Key == "uploadKey") { outputUploadKey = e.Value; } } //POST Create workItem var service = new ForgeService(new HttpClient(new ForgeHandler(Microsoft.Extensions.Options.Options.Create(new ForgeConfiguration() { ClientId = clientID, ClientSecret = clientSecret })) { InnerHandler = new HttpClientHandler() })); var workItemsApiInstance = new WorkItemsApi(service); var workItem = new WorkItem() { ActivityId = clientID + "." + activity + "+" + alias, Arguments = new Dictionary<string, IArgument>() { { "rvtFile", new XrefTreeArgument() { PathInZip = fileNames[n], Url = downloadUrl } }, { "exportChangesSettings", new XrefTreeArgument() { Url = urlDownloadExportChangesSettings } }, { "Result", new XrefTreeArgument() { LocalName = outputFileName, Verb = Verb.Put, Url = uploadUrl } } } }; var workItemResult = await workItemsApiInstance.CreateWorkItemAsync(workItem); var workItemStatus = await api.GetWorkitemStatusAsync(workItemResult.Content.Id);
核心解决方案:直接用APS OSS桶信息作为输出参数
Design Automation支持直接将结果写入你的APS OSS桶,不需要提前生成临时上传URL,从根源上解决过期问题。具体操作如下:
1. 修改WorkItem输出参数配置
把原本传入临时uploadUrl的XrefTreeArgument替换成OSSArgument,直接指定目标桶的BucketKey和对象ObjectKey。这样Design Automation会自动完成授权并写入结果,完全绕开临时URL的过期限制。
2. 修改后的代码示例
//POST Create workItem var service = new ForgeService(new HttpClient(new ForgeHandler(Microsoft.Extensions.Options.Options.Create(new ForgeConfiguration() { ClientId = clientID, ClientSecret = clientSecret })) { InnerHandler = new HttpClientHandler() })); var workItemsApiInstance = new WorkItemsApi(service); var workItem = new WorkItem() { ActivityId = clientID + "." + activity + "+" + alias, Arguments = new Dictionary<string, IArgument>() { { "rvtFile", new XrefTreeArgument() { PathInZip = fileNames[n], Url = downloadUrl } }, { "exportChangesSettings", new XrefTreeArgument() { Url = urlDownloadExportChangesSettings } }, { "Result", // 直接指定OSS桶和对象键,替代临时上传URL new OSSArgument() { BucketKey = urnOutputBucket, ObjectKey = urnOutputObjectKey, Verb = Verb.Put } } } }; var workItemResult = await workItemsApiInstance.CreateWorkItemAsync(workItem); var workItemStatus = await api.GetWorkitemStatusAsync(workItemResult.Content.Id);
3. 关键注意点
- 确保你的APS应用拥有目标桶的写入权限,否则Design Automation无法完成结果写入。
- 不需要再调用
getS3UploadURLAsync接口生成临时URL,减少一次API调用。 - 这种方式不受60分钟限制,不管处理时长多久,任务完成后都会直接写入OSS桶。
备选方案:用Callback触发后续上传(适合非APS存储场景)
如果必须使用外部存储(不是APS OSS),可以通过Callback机制在任务完成后再处理上传:
- 创建workItem时指定
CallbackUrl,任务完成后APS会向该URL发送包含结果文件信息的请求。 - 收到Callback后,生成新的有效上传URL,把结果文件从APS临时存储中转到你的目标存储。
这个方案需要额外搭建Callback服务,适合无法使用APS OSS的场景。
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

