如何在C#中通过Google Cloud Vision设置GOOGLE_APPLICATION_CREDENTIALS?

时间:2019-01-28 20:45:01

标签: c# google-cloud-vision

我正在跟踪this tutorial以使用Google Vision API,但是即使配置身份验证凭据,我也会遇到以下错误:

  

System.InvalidOperationException:'应用程序默认凭据不可用。如果它们在Google Compute Engine中运行,则可用。否则,必须定义环境变量GOOGLE_APPLICATION_CREDENTIALS,指向指向定义凭据的文件。有关更多信息,请参见https://developers.google.com/accounts/docs/application-default-credentials

我在Visual Studio 2017中的代码:

        // Instantiates a client
        var client = ImageAnnotatorClient.Create();
        // Load the image file into memory
        var image = Google.Cloud.Vision.V1.Image.FromFile(@"C:\Users\Maicon\OneDrive\Área de Trabalho\keyboardSantander\keyboard.png");
        // Performs label detection on the image file
        var response = client.DetectLabels(image);
        foreach (var annotation in response)
        {
            if (annotation.Description != null)
                debugOutput(annotation.Description);
        }

该如何解决?我必须创建一个试用帐户才能使用Google Cloud API吗?

2 个答案:

答案 0 :(得分:1)

这些错误消息通常在未正确认证时引发,并且可能由于多种原因而发生,例如文件丢失,无效的凭证路径,错误的环境变量分配等。请记住,在会话中设置环境变量值时,每次删除会话时都会重置该值。

基于此,我建议您遵循official documentation来验证是否已在GCP项目中创建了 auth凭据JSON文件,并且文件路径已正确分配。您可以查看下面列出的代码,其中包含根据Setting Up Authentication指令以C#身份验证Vision API请求所需的过程示例:

using Google.Cloud.Vision.V1;
using System;
using Grpc.Auth;
using Google.Apis.Auth.OAuth2;

namespace VisionDemo
{
    class Program
    {   
        static void Main(string[] args)
        {
            //Authenticate to the service by using Service Account
            var credential = GoogleCredential.FromFile(@"<CRED_JSON_FILEPATH>").CreateScoped(ImageAnnotatorClient.DefaultScopes);
            var channel = new Grpc.Core.Channel(ImageAnnotatorClient.DefaultEndpoint.ToString(), credential.ToChannelCredentials());
            // Instantiates a client
            var client = ImageAnnotatorClient.Create(channel);
            var image = Image.FromFile(@"<IMAGE_FILE_PATH>");
            // Performs label detection on the image file
            var response = client.DetectLabels(image);
            foreach (var annotation in response)
            {
                if (annotation.Description != null)
                    Console.WriteLine(annotation.Description);
            }
        }
    }
}

另一方面,重要的是要考虑到API的使用需要拥有有效的GCP帐户。

最后,由于您未添加使用 Cloud Storage 所需的库和导入,将引发错误消息“名称“ StorageClient”在当前上下文中不存在”。 >语言服务。请注意,这些对象是作为身份验证过程的示例而添加的;但是,如果要使用这些功能,建议您阅读以下快速入门StorageNatural Language

答案 1 :(得分:0)

我尝试了上述所有方法,但仍然没有运气。对我有用的是通过 Environment 类中的 SetEnvironmentVariable 添加环境变量。

string credential_path = @"PATH TO GOOGLE AUTH CREDENTIAL JSON FILE";
System.Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", credential_path);
            
var client = ImageAnnotatorClient.Create();

var image = Image.FromFile(@"PATH TO IMAGE");
           
var response = client.DetectDocumentText(image);