Firebase推送通知中的超时错误

时间:2020-04-09 13:14:24

标签: c# firebase async-await firebase-cloud-messaging

我正在使用Firebase发送推送通知。我有一个功能,可以为将近140,000个用户发送推送通知。对于某些用户,我会收到此错误

Error: A task was canceled.Stack trace:
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
    at Ude.Shared.Firebase.Messaging.FCMClient.<SendMessageAsync>d__10.MoveNext()

此值

ex.CancellationToken.IsCancellationRequested // false

是错误的。

这是我的代码

private static void SendMessage(Messaging.Message message, long messageID)
{
    if (message == null)
    {
        Log.LogWarning($"Couldn't send push notifications. Message id: {messageID}, Message object is null, couldn't get notifications which needs to be sent");
    }
    try
    {
        if (_sendPush)
        {
            FCMClient client = new FCMClient(ServerKey);
            var result = client.SendMessageAsync(message);
        }
    }
    catch (Exception ex)
    {
        Log.LogError($"Couldn't send push notifications. Message id: {messageID}, Exception message: {ex.Message}");
    }
}

上面的函数在这样的循环内被调用

foreach (var token in tokensWithOnbehalfOf) {
    SendMessage(message, pushContent.MessageId);
}

然后函数就是这样发送推送

public async Task<IFCMResponse> SendMessageAsync(Message message)
    {
        if (TestMode) { message.DryRun = true; }

        var serializedMessage = _serializer.Serialize(message);

        var request = new HttpRequestMessage(HttpMethod.Post, FCM_URI);
        request.Headers.TryAddWithoutValidation("Authorization", "key=" + _serverKey);
        request.Content = new StringContent(serializedMessage, Encoding.UTF8, "application/json");
        Log.Log(EventSeverity.Informational, $"push content to {serializedMessage}");

        try
        {
            var client = HttpClient;

            Log.Log(EventSeverity.Warning, $"SendMessageAsyncTimeOut {client.Timeout}");


            var result = await client.SendAsync(request)
                    .ConfigureAwait(false);

            Log.Log(EventSeverity.Warning, $"SendMessageAsyncBefore - Registration ID" +
                                           $" {message.RegistrationIds.First()}" +
                                           $"result from push google: {result.StatusCode.ToString()}");

            if (result.StatusCode != System.Net.HttpStatusCode.OK)
            {

                if (result.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                {
                    throw new FCMUnauthorizedException();
                }


                //TODO: handle retry-timeout for 500 messages
                var errorMessage = await result.Content.ReadAsStringAsync();
                throw new FCMException(result.StatusCode, errorMessage);
            }

            var content = await result.Content.ReadAsStringAsync();

            Log.Log(EventSeverity.Warning, $"SendMessageAsyncAfter - Registration ID" +
                                           $" {message.RegistrationIds.First()}" +
                                           $"result from push google: {content.ToString()}");


            //if contains a multicast_id field, it's a downstream message
            if (content.Contains("multicast_id"))
            {
                return _serializer.Deserialize<DownstreamMessageResponse>(content);
            }

            //otherwhise it's a topic message
            return _serializer.Deserialize<TopicMessageResponse>(content);
        }
        catch (TaskCanceledException ex)
        {
            var cancellation = ex.CancellationToken.IsCancellationRequested;
            // If false, it's pretty safe to assume it was a timeout.

            Log.Log(EventSeverity.Error, $"TaskCanceledExceptionSendMessageAsyncError - Registration ID" +
                                         $" {message.RegistrationIds.First()}" +
                                         $"Error: {ex.Message}" +
                                         $"Stack trace: {ex.StackTrace}" +
                                         $"Cancellation: {cancellation}");
            throw new FCMException(HttpStatusCode.BadRequest, ex.Message);
        }
        catch (Exception ex)
        {
            Log.Log(EventSeverity.Error, $"SendMessageAsyncError - Registration ID" +
                                           $" {message.RegistrationIds.First()}" +
                                           $"Error: {ex.Message}" +
                                           $"Stack trace: {ex.StackTrace}" +
                                           $"Inner message: {ex.InnerException}");
            throw new FCMException(HttpStatusCode.BadRequest, ex.Message);
        }
    }

我在做错什么吗?

0 个答案:

没有答案