Azure文档翻译服务返回202状态码但未生成目标翻译文件,求排查原因
Azure文档翻译服务返回202但无输出文件的排查方案
1. 未跟踪异步任务的实际执行状态
Azure文档翻译的202状态码仅表示请求已被服务接受,不代表翻译任务已成功完成。你当前的代码仅判断状态码后就直接返回结果,没有轮询任务的实际执行状态,后台任务可能已失败但未被捕获。
需要从202响应的Headers中提取Operation-Location字段,通过该URL查询任务状态,直到任务完成或失败。补充代码示例:
if (response.IsSuccessStatusCode) { if (response.Headers.TryGetValues("Operation-Location", out var operationLocations)) { string operationUrl = operationLocations.First(); // 轮询任务状态 while (true) { var statusResponse = await client.GetAsync(operationUrl); string statusContent = await statusResponse.Content.ReadAsStringAsync(); // 解析任务状态(需引入JSON解析库,如Newtonsoft.Json) var statusObj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(statusContent); string currentStatus = statusObj.status; if (currentStatus == "Succeeded") { outcome = $"https://storageaccount.blob.core.windows.net/test/{fname}"; break; } else if (currentStatus == "Failed") { log.Error($"翻译任务失败:{statusObj.error.message}"); break; } // 间隔5秒后再次查询 await Task.Delay(5000); } } }
2. SAS令牌存在权限或有效性问题
检查sourceUrl和targetUrl中的SAS令牌:
- 权限不足:源文件SAS需至少包含
r(读取)权限,目标文件SAS需包含w(写入)、c(创建)权限,确保sp参数包含对应权限位。 - 时间无效:确认
st(开始时间)和se(结束时间)为有效ISO 8601格式(如2024-05-20T08:00:00Z),且当前时间处于该区间内。 - 签名失效:如果生成SAS时的参数(存储账户名、容器名、权限、时间范围)有变更,签名会失效,需重新生成正确的SAS令牌。
3. Blob存储路径或配置错误
- 路径拼写错误:Azure Blob存储的容器名、文件名区分大小写,确认
targetUrl中的路径与实际存储容器、文件名完全一致。 - 容器访问限制:若容器为
Private级别,需确保SAS令牌的权限范围覆盖目标路径;若为Blob/Container级别,确认无额外访问策略限制。 - 目标Blob无法覆盖:若目标Blob已存在,检查SAS令牌是否包含
o(覆盖)权限,或尝试删除已存在的目标Blob后重新测试。
4. Azure服务API版本或路由变更
数月前的代码可能依赖旧版API,需确认:
- 路由正确性:当前使用的
endpoint+route是否符合最新文档翻译服务的要求(如官方推荐的路由为/translator/text/batch/v1.1/documents)。 - 参数兼容性:检查请求体参数格式是否有变更,是否新增必填字段(可对照官方最新文档验证)。
5. 请求体格式或编码问题
输出json变量到日志,确认JSON语法无错误(如引号配对、逗号位置正确);同时确保StringContent的编码(UTF-8)和媒体类型(application/json)设置正确,避免服务无法解析请求体。
内容的提问来源于stack exchange,提问作者Karthik.M
相关产品推荐
相关产品推荐

