'No such device or address'从 .Net Core 上的 FirebaseAdmin SDK 返回



我正在向Firebase Cloud Messaging服务的设备发送推送通知。为此,我在.NET Core上使用了Firebaseadmin SDK。我遵循Firebase文档的确切说明来初始化FirebaseApp并发送消息。由于此代码需要从防火墙后面运行,因此我获得了来自Infra团队的经过测试的代理服务器,以设置Firebase Admin的HTTPClientFactory上,因此我实施了该服务以服务目的。
这是我的代码...

init part

FirebaseApp.Create(new AppOptions()
{
    Credential = GoogleCredential.FromJson("")// service account json content,
    HttpClientFactory = new ProxyHttpClientFactory(new WebProxy()
    {
        Address = new Uri("") //anonymous proxy address
    })
});

httpclientFactory实现

public sealed class ProxyHttpClientFactory : HttpClientFactory
{
    private readonly IWebProxy _proxy;
    public ProxyHttpClientFactory(IWebProxy proxy)
    {
        _proxy = proxy;
    }
    protected override HttpMessageHandler CreateHandler(CreateHttpClientArgs args)
    {
        return new HttpClientHandler
        {
            Proxy = _proxy,
            UseProxy = true,
        };
    }
}

发送firebase消息

var _fcm = FirebaseMessaging.DefaultInstance;
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "title",
        Body = "body"
    },
    Token = "" //valid device token
};
_fcm.SendAsync(message);  

从FCM致电sendasync后,我会收到一个HTTP例外说:
"没有这样的设备或地址"
这很可能意味着代理人尚未正常工作,我仍然被困在防火墙后面。我设法通过curl命令的代理发送消息,但似乎无法从DOT NET侧发挥作用。我已经篡改了WebProxy属性,发送空的凭据,启用并禁用代理本地,发送null for Baypass List等,等等,无济于事。服务帐户内容很好,并且正在设置应有的设置,即使是客户端工厂中的代理设置也似乎已经存在,但不起作用。

任何解决方法都将非常感谢!

好的,在尝试几乎所有内容之后,最终都通过将启用代理的httpclient-factory传递给googlecredentials来解决此问题。显然,在Firebase选项上设置HTTPCLIENTFACTORY还不够,这在我看来是Firebaseadmin中的一个明显错误。无论如何,这就是我修补的方式:

ServiceAccountCredential serviceAccountCredential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer("---client email---")
{
    ProjectId = "---project id----",
    HttpClientFactory = new ProxyHttpClientFactory(new WebProxy()
    {
        Address = new Uri("---anonymous proxy address---")
    })
}.FromPrivateKey("---private key---"));
GoogleCredential googleCredential = GoogleCredential.FromServiceAccountCredential(serviceAccountCredential);

ServiceAccountCredentialGoogleCredentials类型的基础类型。Firebase Admin将负责从高级GoogleCredentials属性中撰写此内容。但是,在这种特殊情况下,它不会将HttpClientFactory注入凭据,从而导致代码无法达到令牌端点。

是的,煮熟的 GoogleCredentials对象稍后将传递给FirebaseApp的Create方法。

相关内容

  • 没有找到相关文章

最新更新