我正在向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);
ServiceAccountCredential
是GoogleCredentials
类型的基础类型。Firebase Admin将负责从高级GoogleCredentials属性中撰写此内容。但是,在这种特殊情况下,它不会将HttpClientFactory
注入凭据,从而导致代码无法达到令牌端点。
是的,煮熟的 GoogleCredentials
对象稍后将传递给FirebaseApp的Create
方法。