我正在使用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);
}
}
我在做错什么吗?