调用Azure认知服务时出现Unauthorized异常的问题排查
看起来你已经排查了几个常见的关键点(密钥匹配、区域正确、有可用额度),但还是遇到了授权失败的问题,结合你的描述和代码片段,我整理了几个容易被忽略的排查方向:
1. 自定义扩展类ComputerVisionApiExtensions可能存在授权逻辑问题
你代码里用的ComputerVisionApiExtensions并非Azure官方SDK的标准类,而是自定义的封装扩展。这种情况下大概率是这个类内部没有正确处理API密钥的传递——比如没把密钥放到请求头的Ocp-Apim-Subscription-Key字段里,或者构造的Endpoint地址格式错误。
建议先换成官方SDK的标准调用方式测试,排除自定义类的问题:
using Microsoft.Azure.CognitiveServices.Vision.ComputerVision; using Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models; using System.Threading.Tasks; // 替换成你的密钥和区域对应的Endpoint var subscriptionKey = "你的API密钥"; var endpoint = "https://你的区域.api.cognitive.microsoft.com/"; // 初始化官方客户端 var client = new ComputerVisionClient(new ApiKeyServiceClientCredentials(subscriptionKey)) { Endpoint = endpoint }; // 调用DescribeImage接口 var result = await client.DescribeImageAsync("https://oxfordportal.blob.core.windows.net/vision/Analysis/1-1.jpg");
如果官方代码能正常运行,那问题肯定出在你的自定义扩展类里,需要检查它的请求构造逻辑。
2. API密钥可能存在隐藏的格式问题
哪怕你确认密钥和Azure门户上一致,也有可能复制时不小心带了空格、换行符或者不可见字符(比如复制时选中了密钥前后的空格)。建议:
- 直接在Azure门户里点击密钥旁边的“复制到剪贴板”按钮,重新复制密钥
- 把复制的密钥粘贴到记事本里,检查前后有没有多余字符,再复制到代码中
3. 区域字符串的格式是否正确
Azure要求区域用短代码格式(比如eastus、westeurope、southeastasia),而不是门户上显示的友好名称(比如“美国东部”)。你可以在Azure门户的Computer Vision服务概览页,查看“Endpoint”字段里的区域部分——比如Endpoint是https://eastus.api.cognitive.microsoft.com/,那区域代码就是eastus,确保代码里的区域参数和这个一致。
4. 网络/防火墙可能拦截了请求
有时候公司网络或者本地防火墙会拦截出站的API请求,导致请求根本没到达Azure服务,这时也会返回Unauthorized错误。你可以:
- 切换到个人网络(比如手机热点)重新运行代码测试
- 用Postman直接调用API验证:构造一个GET请求到
https://<你的区域>.api.cognitive.microsoft.com/vision/v3.2/describe,请求头添加Ocp-Apim-Subscription-Key: <你的密钥>,参数里指定图片URL,看是否能正常返回结果
5. 服务本身的延迟或异常(概率较低)
虽然你等了10分钟,但偶尔Azure服务的密钥生效可能有延迟,或者服务临时异常。可以尝试:
- 重启你的Computer Vision服务(在Azure门户的服务概览页点击“重启”按钮)
- 等待一段时间后再测试
内容的提问来源于stack exchange,提问作者Sigmundur

