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

.NET 4.7.2 Web应用调用UnderlyingCredential.GetAccessTokenForRequestAsync卡住求助

解决Firebase API迁移中GetAccessTokenForRequestAsync()无响应问题

以下是针对你遇到的问题的排查和解决步骤:

  • 排查异步调用死锁
    如果你的调用代码是在同步上下文里(比如用.Wait()、.Result()等待异步方法),大概率会触发死锁,导致方法卡住无响应。解决方式是确保整个调用链都是异步的:上层方法标记为async Task,用await调用令牌获取逻辑,禁止混用同步阻塞操作。

  • 修正GoogleCredential初始化方式
    链式调用FromStream().CreateScoped()可能导致权限范围未正确应用,拆分初始化步骤确保生效:

    var path = ConfigurationManager.AppSettings["google_json_firebase_path"];            
    var scopes = new string[] { "https://www.googleapis.com/auth/firebase.messaging" };   
    GoogleCredential cred;
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        cred = GoogleCredential.FromStream(stream);
        cred = cred.CreateScoped(scopes); // 单独调用确保范围生效
    }
    

    同时确认服务账号JSON文件路径正确、有读取权限,文件内容未损坏。

  • 避免直接访问UnderlyingCredential
    GoogleCredential本身封装了GetAccessTokenForRequestAsync方法,直接调用比访问底层凭据更可靠,能适配不同类型的凭据实现:

    var token = await cred.GetAccessTokenForRequestAsync();
    
  • 添加详细日志排查问题
    扩展日志和异常捕获,获取更多上下文信息,包括内部异常和堆栈:

    try
    {
        Console.WriteLine("开始获取Firebase访问令牌");
        var token = await cred.GetAccessTokenForRequestAsync();
        Console.WriteLine($"令牌获取成功,前20位: {token?.Substring(0, 20)}...");
        return token;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"错误信息: {ex.Message}");
        if (ex.InnerException != null)
        {
            Console.WriteLine($"内部错误: {ex.InnerException.Message}");
        }
        Console.WriteLine($"错误堆栈: {ex.StackTrace}");
    }
    
  • 检查网络连通性
    确认服务器能访问Google OAuth2令牌服务地址https://oauth2.googleapis.com/token,如果在防火墙或代理环境下,需配置相应的网络规则或代理参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:20:55