调用ModelDerivativeClient接口返回401错误的技术咨询
问题
基于HubsBrowser示例扩展开发,目标是通过Web应用浏览ACC中的模型,并使用FetchSpecificPropertiesAsync提取选中模型的所有属性,目前已完成:
- 获取3-legged token,可正常浏览项目/文件夹/文件
- 点击文件特定版本可在Viewer中展示
- 尝试使用InternalToken调用Model Derivative API的
GetManifestAsync(传入文件URN的Base64编码)时,返回401未授权错误
疑问:
- 是否可默认ACC文件已完成翻译,无需处理翻译或存储桶操作?
- 通过ACC文件URN能否直接访问其manifest?
- 是否缺少Model Derivative API所需的权限范围?
当前代码
控制器代码
[HttpGet("{objectId}/modelviews")] public async Task<ActionResult> GetModelViews(string objectId) { //Eg objectId: urn:adsk.wipprod:fs.file:vf.bOz5StqZQoqUqQLDlxdrSg var tokens = await AuthController.PrepareTokens(Request, Response, _aps); var modelViews = await _aps.GetManifestAsync(objectId, tokens); return Ok(modelViews); }
服务调用代码
public partial class APS { public static string Base64Encode(string plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes).TrimEnd('='); } public async Task<Manifest> GetManifestAsync(string objectId, Tokens tokens) { var modelDerivativesClient = new ModelDerivativeClient(); var modelUrn = Base64Encode(objectId); try { var manifest = await modelDerivativesClient.GetManifestAsync(modelUrn, accessToken: tokens.InternalToken); return manifest; } catch(Exception ex) { } return null; } }
错误信息:Unauthorized 401
解答
ACC文件翻译状态:是的,ACC中上传的标准格式文件(如Revit、AutoCAD等)会自动触发翻译流程,默认已完成翻译,无需手动处理翻译任务或存储桶相关操作,除非是特殊格式或手动取消了自动翻译。
ACC文件URN访问manifest:可以直接访问。ACC文件的URN(如示例中的
urn:adsk.wipprod:fs.file:vf.bOz5StqZQoqUqQLDlxdrSg)经过正确的Base64编码后,可直接作为Model Derivative API的urn参数使用。权限范围问题:401错误大概率是权限不足导致。Model Derivative API需要以下权限范围:
data:read:用于读取模型数据及manifest- 若后续要提取模型属性,还需
data:search权限
检查你的应用权限配置,确保已包含上述范围;同时确认3-legged token在用户授权时已获取到这些权限,InternalToken需包含对应权限范围才能调用成功。
额外排查点:
- 修正Base64编码逻辑:需要做URL安全的Base64编码,即把标准Base64中的
+替换为-,/替换为_,再去掉末尾的=。当前代码仅去掉了=,可能导致API无法正确识别URN - 验证token有效性:确认调用
GetManifestAsync时,InternalToken未过期,且对应正确的用户和项目上下文
- 修正Base64编码逻辑:需要做URL安全的Base64编码,即把标准Base64中的
内容的提问来源于stack exchange,提问作者theandroid
相关产品推荐
相关产品推荐

