Inventor工作项中从AppBundle上传文件至OSS Bucket失败求助
问题排查与解决方案
核心原因:异步操作未正确等待
HttpClient.PutAsync是异步方法,若未使用await关键字等待其完成,任务会一直处于Waiting for Activation状态,不会实际执行上传操作,这是触发该状态最常见的原因。
修正步骤
1. 确保异步方法正确等待
修改代码,在调用PutAsync时添加await,同时将包含该调用的方法标记为async:
using (var httpClient = new HttpClient()) using (var fileStream = File.OpenRead("保存后的装配文件路径")) { // 替换为你的OSS预签名PUT请求URL var ossUrl = "https://your-bucket.oss-cn-region.aliyuncs.com/target-file.iam"; var response = await httpClient.PutAsync(ossUrl, new StreamContent(fileStream)); response.EnsureSuccessStatusCode(); // 验证上传是否成功 }
2. 检查OSS预签名URL有效性
- 确认URL为PUT请求类型的预签名链接,且未过期(OSS预签名URL默认有效期3600秒)。
- 核对URL中的签名、Bucket名称、目标文件路径是否存在拼写错误。
3. 适配Workitem环境的文件路径
在Autodesk Forge Workitem环境中,需使用活动工作目录拼接文件路径,确保文件定位准确:
var workingDir = ActivityContext.Current.WorkingDirectory; var outputFilePath = Path.Combine(workingDir, "modified-assembly.iam"); // 执行Inventor文件保存操作
4. 规避Inventor线程阻塞问题
Inventor API运行在单线程公寓(STA)环境中,直接在主线程执行长时间网络操作易导致阻塞。建议将上传逻辑放在后台线程执行,注意需确保文件完全保存后再启动上传:
// 文件保存完成后启动后台上传 Task.Run(async () => { using (var httpClient = new HttpClient()) using (var fileStream = File.OpenRead(outputFilePath)) { var response = await httpClient.PutAsync(ossUrl, new StreamContent(fileStream)); if (!response.IsSuccessStatusCode) { var errorDetail = await response.Content.ReadAsStringAsync(); ActivityContext.Current.LogError($"上传失败: {errorDetail}"); } } }).Wait(); // 若需等待上传完成则保留Wait(),否则可移除但需处理异常
5. 验证文件状态与权限
- 确认Inventor的
SaveAs方法已完全执行完毕,文件已写入磁盘。 - 检查Workitem运行环境对目标文件有读取权限,避免因权限不足导致流读取失败。
调试建议
- 添加日志记录关键信息,方便定位问题:
var fileInfo = new FileInfo(outputFilePath); ActivityContext.Current.LogInformation($"待上传文件: {outputFilePath}, 大小: {fileInfo.Length} bytes"); ActivityContext.Current.LogInformation($"OSS目标URL: {ossUrl}");
- 捕获并记录异常细节:
try { var response = await httpClient.PutAsync(ossUrl, new StreamContent(fileStream)); response.EnsureSuccessStatusCode(); } catch (Exception ex) { ActivityContext.Current.LogError($"上传异常: {ex.Message}\n堆栈信息: {ex.StackTrace}"); }
内容的提问来源于stack exchange,提问作者user21330330
相关产品推荐
相关产品推荐

