谷歌云 API 没有返回任何响应
Posted
技术标签:
【中文标题】谷歌云 API 没有返回任何响应【英文标题】:Google Cloud API not returning any response 【发布时间】:2018-11-15 19:32:47 【问题描述】:背景资料: 我正在尝试使用他们的.NET library 为 Google Cloud Vision API 创建一个 PoC。
我做了什么: 使用以下代码为 Vision API 创建一个简单的控制台应用程序。
GoogleCredential credential = GoogleCredential.FromFile(ConfigurationManager.AppSettings["GoogleCredentialFile"]);
Grpc.Core.Channel channel = new Grpc.Core.Channel(Google.Cloud.Vision.V1.ImageAnnotatorClient.DefaultEndpoint.ToString(), credential.ToChannelCredentials());
var client = Google.Cloud.Vision.V1.ImageAnnotatorClient.Create(channel);
var image = Google.Cloud.Vision.V1.Image.FromFile(@"C:\Users\u065340\Documents\sample.jpg");
var response = client.DetectLabels(image);
foreach (var annotation in response)
if (annotation.Description != null)
result = annotation.Description;
问题:client.DetectLabels(image)
行卡住了很长时间,然后最终抛出错误 Deadline Exceeded
。
我的代码位于公司代理后面,但我已经验证它不会阻止互联网访问,因为我可以从相同的应用程序调用 https://vision.googleapis.com/$discovery/rest?version=v1 并获得它的 JSON 响应。
有什么建议吗?
【问题讨论】:
你能澄清一下你所说的“很长一段时间”是什么意思吗?完全有可能的一件事是,您的代理适用于 HTTP/1.1,但与 gRPC 使用的 HTTP/2.0 行为不符。您可以在家中尝试相同的代码吗? 我在获取系统加载的这一行中也得到了相同的结果:var response = client.DetectLabels(image); . @JonSkeet @zahed:没有更多信息,很难进一步了解。这里有各种各样的变量——它运行的平台、涉及的任何代理、它使用的 .NET 版本等等。 对我来说,它在 20 分钟后显示错误:Google.Api.Gax.Grpc.dll 中发生了“Grpc.Core.RpcException”类型的异常,但未在用户代码中处理其他信息:状态(StatusCode=DeadlineExceeded, Detail="Deadline Exceeded") 。 @JonSkeet @zahed:对。这是一个开始,但还有其他重要的信息。这是控制台应用程序、Web 应用程序还是其他什么?你是在开发机器上运行它,还是在 Azure、AWS、GCP 或其他地方运行它?代理情况如何?您是否可以使用任何其他基于 gRPC 的 API? 【参考方案1】:按照 Jon Skeet 的建议,通过与代理相关的 github 问题进行挖掘后,我发现 Google Cloud 客户端 API 通常可以分为 2 类(参考:here):基于 REST 的 HTTP 1.1 和 JSON 和 gRPC。 对于基于 REST 的 API,代理应该没有问题。当我们使用基于 gRPC 的 API(例如 Google Cloud Vision 和 Google Speech)时,问题开始出现。在 gRPC 中,我们需要显式地提供我们的代理服务器信息。
对于那些使用 Java Client 的人来说,我们似乎仍然无法正确设置代理,因为它最终会被忽略,并导致 Deadline Exceeded
错误。此问题已广为人知,可在here 找到并进一步追溯到here。
谷歌团队已经确定确实是一个bug,状态依然是Open。
对于 C# 客户端,我们可以使用 gRPC 环境变量设置代理信息,该环境变量记录在 here 中。代码是Environment.SetEnvironmentVariable("http_proxy", <your_proxy_server>);
在我将http_proxy
环境变量设置为指向我的代理服务器后,一切都好起来了。我得到预期的输出“此 API 需要计费帐户”。
非常感谢 Jon Skeet 为我指明了正确的方向:D
【讨论】:
很高兴我能帮上忙 - 感谢您接球并带着它奔跑,可以这么说 :)以上是关于谷歌云 API 没有返回任何响应的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)