«Нет такого устройства или адреса» возвращено из FirebaseAdmin SDK в .Net Core - PullRequest
0 голосов
/ 01 июля 2019

Я отправляю push-уведомления на устройства из службы облачных сообщений Firebase. Для этого я использовал FirebaseAdmin SDK на .Net Core. Я следовал точным инструкциям из документации Firebase, чтобы инициализировать FirebaseApp и отправлять сообщения. Поскольку этот код должен был выполняться из-за брандмауэра, мне был предоставлен протестированный прокси-сервер от нашей команды для установки на HttpClientFactory администратора Firebase, который я поэтому реализовал для этой цели.
Вот мой код ...

Начальная часть

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);  

После вызова SendAsync из FCM я получу исключение http, говорящее:
«Нет такого устройства или адреса»
Что наиболее вероятно означает, что прокси не работал должным образом, и я все еще застрял за брандмауэром. Мне удалось отправить сообщение через прокси из команды Curl, но я не могу заставить его работать со стороны точечной сети. Я вмешался в свойства WebProxy, отправив пустые учетные данные, включив и отключив прокси-сервер для локального сервера, отправив ноль для списка байпасов и т. Д., Но все безрезультатно. Содержимое учетной записи службы в порядке и устанавливается должным образом, даже настройки прокси-сервера в фабрике клиентов, кажется, установлены, но не работают.

Любой обходной путь / решения будут безоговорочно приветствоваться!

1 Ответ

0 голосов
/ 02 июля 2019

Хорошо, после того, как опробовали почти все, наконец-то удалось решить эту проблему, передав HttpClientFactory с включенным прокси-сервером и в GoogleCredentials. Видимо, установки параметров HttpClientFactory в Firebase недостаточно, что, на мой взгляд, является очевидной ошибкой в ​​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 позаботится о создании этого из высокоуровневого свойства GoogleCredentials. Тем не менее, в этом особом случае он не введет HttpClientFactory в учетные данные, из-за чего код не сможет достичь конечной точки токена.

Так что да, готовый объект GoogleCredentials будет позже передан методу FirebaseApp Create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...