我使用带有C#(dotnet core(的Google cloud Stackdriver Trace API,并根据本文工作。
我已经添加了所有需要的代码,并希望在本地(在我的开发机器上(尝试它。由于我没有从 GCP 云运行,因此我创建了一个具有所需权限的新服务帐户。谷歌在文章中说:
GCP 客户端库使用应用程序默认凭据 (ADC( 查找 应用程序的凭据。您可以通过以下方式提供这些凭据 设置GOOGLE_APPLICATION_CREDENTIALS环境变量:
export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key
现在我的代码在达到这一点时失败:
services.AddGoogleExceptionLogging(options =>
{
options.ProjectId = Configuration["Stackdriver:ProjectId"];
options.ServiceName = Configuration["Stackdriver:ServiceName"];
options.Version = Configuration["Stackdriver:Version"];
});
随着消息:
System.InvalidOperationException: '从 读取凭据文件时出错 位置 C:******.json:找不到文件。 请检查环境的值 可变GOOGLE_APPLICATION_CREDENTIALS'
由于多种原因,我不想使用名为GOOGLE_APPLICATION_CREDENTIALS
的环境变量。相反,我正在寻找一种在不使用环境变量的情况下为其提供实际文件路径的方法。
我该怎么做?
既然你不想使用环境变量,你有没有尝试过使用 gcloud SDK 进行身份验证?
正如这里解释的:
如果在本地运行以进行开发/测试,则可以使用 Google Cloud SDK 进行身份验证。下载 SDK(如果尚未下载(,然后通过在命令行中运行以下命令登录:
GCLOUD 身份验证应用程序默认登录
否则,唯一的其他方法是指定源代码上的路径。
您应该能够使用此处提供的示例来执行此操作。调整它以满足您的特定需求。
此示例演示如何使用从 JSON 文件加载的凭据创建客户端:
using Google.Cloud.ErrorReporting.V1Beta1;
using Google.Apis.Auth.OAuth2;
using Grpc.Auth;
using Grpc.Core;
...
GoogleCredential cred = GoogleCredential.FromFile("/path/to/credentials.json");
Channel channel = new Channel(
ReportErrorsServiceClient.DefaultEndpoint.Host, ReportErrorsServiceClient.DefaultEndpoint.Port, cred.ToChannelCredentials());
ReportErrorsServiceClient client = ReportErrorsServiceClient.Create(channel);
...
// Shutdown the channel when it is no longer required.
channel.ShutdownAsync().Wait();
您正在使用的命令
出口 GOOGLE_APPLICATION_CREDENTIALS=服务帐户私钥的路径
在 Linux 中使用,但您的帖子指定的错误
....从位置 C:******.json 读取凭据文件时出错:可能 找不到文件.....
在这种情况下,您似乎正在使用Windows,并且需要使用命令"SET"来分配值,位于"设置环境变量"段落中。
您还可以在代码中传递服务帐户密钥,在这种情况下,您需要安装 Cloud Storage 客户端库,您可以在"在代码中传递服务帐户密钥的路径"段落中查看示例,您可以在其中查看此 C# 代码,并且您有一个指向 GitHub 的链接带有示例代码。
// Some APIs, like Storage, accept a credential in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)
{
// Explicitly use service account credentials by specifying
// the private key file.
var credential = GoogleCredential.FromFile(jsonPath);
var storage = StorageClient.Create(credential);
// Make an authenticated API request.
var buckets = storage.ListBuckets(projectId);
foreach (var bucket in buckets)
{
Console.WriteLine(bucket.Name);
}
return null;
}
// Other APIs, like Language, accept a channel in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)
{
var credential = GoogleCredential.FromFile(jsonPath)
.CreateScoped(LanguageServiceClient.DefaultScopes);
var channel = new Grpc.Core.Channel(
LanguageServiceClient.DefaultEndpoint.ToString(),
credential.ToChannelCredentials());
var client = LanguageServiceClient.Create(channel);
AnalyzeSentiment(client);
return 0;
}