You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AccessToken调用Firestore获取集合时遇Grpc连接错误求助

解决Firestore客户端使用AccessToken时的Grpc Unavailable错误

问题背景

使用AccessToken连接Firestore时抛出Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses"),但Postman可正常通过REST接口获取数据,且不使用Firebase Admin SDK。

核心原因

默认的Firestore .NET客户端使用Grpc协议通信,部分环境(如代理、防火墙)会拦截Grpc流量;而Postman使用的是Firestore REST API,不受此限制。此外,Token权限配置或客户端网络设置也可能导致该问题。

解决方案

1. 强制切换为REST API通信

修改Firestore客户端配置,强制使用REST接口替代Grpc,和Postman的通信方式保持一致:

private static FirestoreDb GetFirestoreDb()
{
    var builder = new FirestoreDbBuilder();
    builder.ProjectId = "Your-Project-Id";
    // 从Firebase Auth接口获取的有效AccessToken
    string oauthToken = "Your-Access-Token";
    ITokenAccess credential = GoogleCredential.FromAccessToken(oauthToken);
    builder.TokenAccessMethod = credential.GetAccessTokenForRequestAsync;
    
    // 关键配置:启用REST API
    builder.UseRestApi = true;
    
    // 若需代理,添加以下配置(根据实际环境调整)
    // builder.HttpClient = new HttpClient(new HttpClientHandler
    // {
    //     Proxy = new WebProxy("http://your-proxy-address:port", true),
    //     UseProxy = true
    // });

    return builder.Build();
}

2. 验证AccessToken的有效性与权限

  • 确认Token是通过Firebase Auth的signInWithCustomToken接口正确获取,且未过期
  • 检查Token包含的权限范围:需包含https://www.googleapis.com/auth/datastore或https://www.googleapis.com/auth/firestore
  • 确认Firebase安全规则允许该Token对应的用户访问目标集合(如windows_test),示例规则:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /windows_test/{document} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

3. 调整Grpc网络配置(若坚持使用Grpc)

如果必须使用Grpc,可配置客户端适配代理或调整连接策略:

private static FirestoreDb GetFirestoreDb()
{
    var builder = new FirestoreDbBuilder();
    builder.ProjectId = "Your-Project-Id";
    string oauthToken = "Your-Access-Token";
    ITokenAccess credential = GoogleCredential.FromAccessToken(oauthToken);
    builder.TokenAccessMethod = credential.GetAccessTokenForRequestAsync;
    
    // 配置Grpc通道的代理与重试策略
    builder.GrpcChannelOptions = new GrpcChannelOptions
    {
        HttpHandler = new HttpClientHandler
        {
            Proxy = new WebProxy("http://your-proxy-address:port", true),
            UseProxy = true
        },
        MaxRetryAttempts = 3,
        RetryPolicy = Grpc.Core.RetryPolicy.Default
    };

    return builder.Build();
}

验证

修改配置后重新运行代码,若切换到REST API,应能和Postman一样正常获取集合数据。

内容的提问来源于stack exchange,提问作者Osama Nasir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:44:56