如何使用 .net core 连接到 Cloud Firestore 数据库?

11
到目前为止,所有使用 .Net 连接Google Cloud Firestore 的示例都表明您需要使用以下命令连接您的Firestore数据库:
FirestoreDb db = FirestoreDb.Create(projectId);

但是这是否跳过了身份验证的步骤呢?我似乎找不到一个将其连接到使用谷歌服务帐户的例子。我猜想您需要使用服务帐户的private_key/private_key_id/client_email进行连接?


1
看起来您需要创建一个 GOOGLE_APPLICATION_CREDENTIALS 环境变量,然后根据此文档将服务账户凭据的 JSON 文件内容设置为该变量。我现在正在尝试这个方法。 - mkimmet
谷歌文档真的很糟糕... - Rony Tesler
5个回答

13

您还可以使用存储在 JSON 文件中的凭据:

    GoogleCredential cred = GoogleCredential.FromFile("credentials.json");
    Channel channel = new Channel(FirestoreClient.DefaultEndpoint.Host,
                  FirestoreClient.DefaultEndpoint.Port,
                  cred.ToChannelCredentials());
    FirestoreClient client = FirestoreClient.Create(channel);
    FirestoreDb db = FirestoreDb.Create("my-project", client);

我没有尝试过,也许吧。总的来说,我对Firestore的性能感到失望(每个查询需要大约500毫秒),所以我们无论如何都停止使用它了。 - Michael Bleterman
1
@cdaiga,我们已经迁移到了BigTable - 它的性能非常出色(但价格也是如此...) - Michael Bleterman

12

我无法编译 @Michael Bleterman 的代码,但是以下方法适用于我:

using Google.Cloud.Firestore;
using Google.Cloud.Firestore.V1;


var jsonString = File.ReadAllText(_keyFilepath);
var builder = new FirestoreClientBuilder {JsonCredentials = jsonString};
FirestoreDb db = FirestoreDb.Create(_projectId, builder.Build());

我使用的软件包:

<PackageReference Include="Google.Cloud.Firestore" Version="2.0.0-beta02" />
<PackageReference Include="Google.Cloud.Storage.V1" Version="2.5.0" />

6
但这是否跳过了身份验证步骤?
不是的。它将使用默认的应用凭据。如果您在Google Cloud Platform上运行(AppEngine,GCE或GKE),它们将只是实例的默认服务帐户凭据。否则,您应该设置“GOOGLE_APPLICATION_CREDENTIALS”环境变量以引用服务帐户凭据文件。
从您提到的用户指南首页中:
在Google Cloud Platform上运行时,无需采取任何措施进行身份验证。
否则,身份验证API调用的最简单方法是下载服务帐户JSON文件,然后将“GOOGLE_APPLICATION_CREDENTIALS”环境变量设置为引用它。凭据将自动用于身份验证。有关更多详细信息,请参见身份验证入门指南。
使用非默认凭据有点笨拙; 这个最近的问题给出了一个例子。

1
感谢您的回复!我现在遇到的问题是如何使 GOOGLE_APPLICATION_CREDENTIALS 环境变量正确指向我的 .net core 应用程序中的 json 文件。我想我会尝试一下您提供的链接中针对非默认凭据的方法,这可能对我有更好的效果,也有其他原因。 - mkimmet
@mkimmet:总的来说,这需要更多的工作量。你在设置环境变量方面遇到了什么问题?这应该是很简单的... - Jon Skeet
我已根据您提供的非默认凭据链接让它工作了。但是,我已经尝试过appsettings.json和VS用户机密,并引用了"GOOGLE_APPLICATION_CREDENTIALS":"我的-firestore-credentials.json",并且还尝试在文件名之前加上"./"和"~/",但仍然出现错误:InvalidOperationException: 应用程序默认凭据不可用...环境变量GOOGLE_APPLICATION_CREDENTIALS必须定义指向定义凭据的文件。 我猜我在路径或环境变量方面做错了什么。 - mkimmet
1
@mkimmet:这些是ASP.NET Core的设置 - 这与设置环境变量不同。不知道您如何运行代码,这使得很难知道如何建议设置环境变量,不幸的是。例如,在Dockerfile中,您只需使用ENV指令。您应该查找有关在特定执行环境中设置环境变量的文档。(这将是非常通用的文档 - 与ASP.NET Core或Firestore无关。) - Jon Skeet
这很有道理,我想我把我的"环境"变量搞混了。我需要更多地研究一下在我设置 .net core 的方式下如何做真正的环境变量。谢谢! - mkimmet

5

我发现你对 GetAwaiter 的调用很有用,可以避免使用 await/async:QuerySnapshot querySnapshot = query.GetSnapshotAsync().GetAwaiter().GetResult(); - Shadi
@Shadi 这不是一个好主意。http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html - MEMark

1

最简单的方法:

获取服务帐户JSON文件并将值硬编码到类中:

    public class FirebaseSettings
    {
        [JsonPropertyName("project_id")]
        public string ProjectId => "that-rug-really-tied-the-room-together-72daa";
    
        [JsonPropertyName("private_key_id")]
        public string PrivateKeyId => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    
        // ... and so on
    }

Startup.cs中添加它。
var firebaseJson = JsonSerializer.Serialize(new FirebaseSettings());

services.AddSingleton(_ => new FirestoreProvider(
    new FirestoreDbBuilder 
    { 
        ProjectId = firebaseSettings.ProjectId, 
        JsonCredentials = firebaseJson // <-- service account json file
    }.Build()
));

添加包装器FirebaseProvider

public class FirestoreProvider
{
    private readonly FirestoreDb _fireStoreDb = null!;

    public FirestoreProvider(FirestoreDb fireStoreDb)
    {
        _fireStoreDb = fireStoreDb;
    }

    // ... your methods here

}

这是一个通用提供程序的完整示例。 这里有一个简单的 .NET Core 和 Cloud Firestore 设置示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接