首页 文章

当我将APN发送到Apple服务器时,有时会出现Timeout异常

提问于
浏览
2

我的代码:

var uri = new Uri($"{domain}/3/device/{deviceToken}");

var client = new Http2Client(uri); // using HttpTwo

var headers = new NameValueCollection
{
    {"apns-id", Guid.NewGuid().ToString()},
    {"apns-expiration", "0"},
    {"apns-priority", "10"},
    {"apns-topic", topic},
    {"authorization", $"bearer {jwtToken}"}
};

var body = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(payload));

var response = await client.Send(uri,HttpMethod.Post, headers, body);

这段代码大部分时间给出了适当的响应,但有一段时间我得到的操作已经超时了Exception .

---> System.TimeoutException:操作已超时 . 在HttpTwo.Http2Client.d__19.MoveNext()---从抛出异常的先前位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . HttpTwo.Http2Client.d__17.MoveNext()中的HandleNonSuccessAndDebuggerNotification(任务任务)---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处HttpTwo.Http2Client.d__15.MoveNext()中的.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

1 回答

  • 0

    您可以为您的连接设置Http2Client.ConnectionSettings.ConnectionTimeout,以便更可预测)))并且您应该为apns连接实现重新连接逻辑 . 像这样的东西:

    int retry = 0;
     while (retry < 1)
     {
         try
        {
            var response = await client.Send(uri,HttpMethod.Post, headers, body);
            break;
        }
        catch (TimeoutException)
        {
            retry++;
        }
    }
    

    来自文档:

    通过多个通知保持与APN的连接;不要反复打开和关闭连接 . APN将快速连接和断开视为拒绝服务攻击 . 您应该保持连接打开,除非您知道它将在一段时间内处于空闲状态 - 例如,如果您每天只向用户发送一次通知,则可以接受每天使用新连接的做法 .

相关问题