You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:53:00