示例#1
0
        private async Task EnqueueTokens(CancellationToken ct, PushRequest request, Dictionary <string, Alert> dicLang, List <PushToken> tokens)
        {
            request.Locale = request.Locale.Replace(" ", string.Empty);

            if (!string.IsNullOrEmpty(request.Locale))
            {
                var localeSet = StringEx.FromStringWithCommaToHashSet <string>(request.Locale);
                tokens = CheckNightPushTokens(localeSet, tokens);
                if (!tokens.Any())
                {
                    return;
                }
            }

            while (!ct.IsCancellationRequested)
            {
                using (await queueLock.LockAsync())
                {
                    if (queue.Count < 2000)
                    {
                        foreach (PushToken token in tokens)
                        {
                            if (dicLang.TryGetValue(token.Language, out var alert) == false)
                            {
                                alert = dicLang[DefaultLanguage];
                            }

                            queue.Enqueue(new TokenAlert {
                                Request = request, Seq = token.Seq, Token = token.DeviceToken, Alert = alert
                            });
                        }

                        break;
                    }
                }

                await Task.Delay(100, ct);
            }
        }
示例#2
0
        public async Task <HttpResponse> RequestAsync(string token, AndroidNotification notification)
        {
            using (await _semaphoreLock.LockAsync())
            {
                var now = DateTime.UtcNow;

                if (_accessToken == null || now > _accessTokenExpireTime)
                {
                    _accessToken = await _googleCredential.UnderlyingCredential.GetAccessTokenForRequestAsync();

                    _accessTokenExpireTime = now + _accessTokenLifeTime;

                    var handler = new SocketsHttpHandler
                    {
                        MaxConnectionsPerServer = int.MaxValue,
                        SslOptions = new SslClientAuthenticationOptions {
                            EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls
                        }
                    };

                    _client                       = new HttpClient(handler, true);
                    _client.BaseAddress           = _baseUri;
                    _client.DefaultRequestVersion = new System.Version(2, 0);
                    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);
                    _client.DefaultRequestHeaders.Connection.Add("keep-alive");
                }
            }

            var json = FcmMessage.SetTokenAndData(token, notification).ToJson();

            using var res = await _client.PostAsync("", new StringContent (json, Encoding.UTF8, "application/json"));

            return(new HttpResponse
            {
                StatusCode = res.StatusCode,
                Reason = res.ReasonPhrase
            });
        }