Xamarin调用Azure计算机视觉API报错:DescribeImageInStreamAsync返回NotFound
解决Azure计算机视觉API调用"Not Found"错误及图像描述失效问题
看起来你遇到的核心问题是调用DescribeImageInStreamAsync时触发了Not Found异常,同时图像描述功能完全没输出。咱们一步步拆解问题并修复:
一、先搞定最直接的"Not Found"问题
这个错误90%和Azure服务的配置有关,你得先确认这几点:
- API密钥和端点不能留空:你代码里
new ApiKeyServiceClientCredentials("")和visionapi.Endpoint = ""都是空字符串,这肯定不行。去Azure门户找到你的计算机视觉资源,复制正确的密钥(有两个密钥,随便用哪个都行)和端点URL(格式一般是https://<你的资源区域>.cognitiveservices.azure.com/)填进去。 - 端点区域要匹配:比如你的资源部署在East US,端点就得是
https://eastus.cognitiveservices.azure.com/,区域不匹配绝对会返回Not Found。
二、修复流读取的隐形坑
你代码里连续两次调用file.GetStream():第一次给ImageView显示图片,第二次传给API。但Stream读取后,Position会自动跳到末尾,第二次读取时就没数据了,这也会导致API调用失败。解决方法有两种:
// 方法1:重置流的位置(适合支持重置的流) var stream = file.GetStream(); img.Source = ImageSource.FromStream(() => stream); stream.Position = 0; // 把指针拉回开头,API就能读到完整图像了 // 方法2:重新获取流(更稳妥,避免某些流不支持Position操作) img.Source = ImageSource.FromStream(() => file.GetStream()); var apiStream = file.GetStream(); // 重新拿一个新的流实例给API
三、完善异常处理,别再当"睁眼瞎"
你现在的catch块只显示"ERROR",根本看不到具体错误细节,调试起来太费劲。改成这样,能帮你快速定位问题:
catch (Exception ex) { await DisplayAlert("错误详情", $"错误类型:{ex.GetType().Name}\n错误信息:{ex.Message}", "OK"); }
四、修改后的完整代码示例
结合上面的修复,你的代码可以改成这样(记得替换成自己的密钥和端点):
private async void Button_Clicked(object sender, EventArgs e) { await CrossMedia.Current.Initialize(); try { if (!CrossMedia.Current.IsTakePhotoSupported && !CrossMedia.Current.IsPickPhotoSupported) { await DisplayAlert("INFO", "CAMERA NOT AVAILABLE", "OK"); return; } var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions { Directory = "Images", Name = "test.jpg" }); if (file == null) { await DisplayAlert("ERROR", "FILE NOT FOUND", "OK"); return; } // 显示图片并重置流位置 var stream = file.GetStream(); img.Source = ImageSource.FromStream(() => stream); stream.Position = 0; // 初始化计算机视觉客户端(替换成你的密钥和端点) var apiKey = "你的Azure计算机视觉API密钥"; var endpoint = "你的Azure计算机视觉端点URL"; var visionapi = new ComputerVisionClient(new ApiKeyServiceClientCredentials(apiKey)) { Endpoint = endpoint }; // 调用图像描述API var desc = await visionapi.DescribeImageInStreamAsync(stream); // 拼接字幕并显示(加上置信度更直观) cap.Text = string.Empty; foreach (var caption in desc.Captions) { cap.Text += $"\n{caption.Text} (置信度:{caption.Confidence:P2})"; } // 如果没生成字幕,给个提示 if (string.IsNullOrEmpty(cap.Text)) { cap.Text = "未生成有效图像描述"; } } catch (Exception ex) { await DisplayAlert("错误详情", $"错误类型:{ex.GetType().Name}\n错误信息:{ex.Message}", "OK"); } }
额外检查点
- Azure资源防火墙规则:确认你的应用所在网络(比如手机的移动网络)被允许访问这个计算机视觉资源,防火墙限制也会导致Not Found。
- API调用限额:如果用的是免费层资源,可能已经达到调用次数上限,去Azure门户看看资源的使用情况。
内容的提问来源于stack exchange,提问作者user11640506
相关产品推荐
相关产品推荐

