Google Cloud API未返回任何回复

时间:2018-06-06 07:46:02

标签: c# .net ocr google-cloud-vision

背景资料:
我正在尝试使用他们的.NET library创建一个用于Google Cloud Vision API的PoC。

我做了什么:
使用以下Visual 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响应。 有什么建议吗?

1 个答案:

答案 0 :(得分:3)

根据Jon Skeet的建议挖掘出与代理相关的github问题之后,我发现Google Cloud Client API通常可以分为两类(参考:here):基于REST的HTTP 1.1和JSON以及GRPC。
对于与基于REST关联的API,代理应该没有问题。当我们使用基于gRPC的API(例如Google Cloud Vision和Google Speech)时,问题就开始出现了。在gRPC中,我们需要明确提供代理服务器信息。

对于那些使用Java Client的人来说,似乎我们仍然无法正确设置代理,因为它最终会被忽略,并导致Deadline Exceeded错误。此问题已众所周知,可在here找到,并进一步追溯到here 谷歌团队已经确定它确实是一个错误,状态仍为开放状态。

对于C#Client,我们可以使用here中记录的gRPC环境变量设置代理信息。代码为Environment.SetEnvironmentVariable("http_proxy", <your_proxy_server>);
在我将http_proxy环境变量设置为指向我的代理服务器之后,一切都很好。我得到了预期的输出&#34;此API需要结算帐户&#34;。

非常感谢Jon Skeet指出我正确的方向:D