2017-04-03 27 views
1

我的代碼:有時候,我不得不超時異常,當我送APN到蘋果服務器

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

這個代碼給予適當的迴應的大部分時間,但過一段時間,我得到了操作超時異常。

---> System.TimeoutException:操作已超時。 at HttpTwo.Http2Client.d__19.MoveNext() ---前一個位置拋出異常的堆棧跟蹤結束--- 位於System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務) 位於System.Runtime。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務task) 在HttpTwo.Http2Client.d__17.MoveNext() ---從先前的位置堆棧跟蹤的結束,其中引發異常--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at HttpTwo.Http2Client.d__15.MoveNext()

+0

我們也有。你有沒有找到解決辦法? –

+0

我有同樣的問題,解決方案? –

回答

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將快速連接和斷開視爲拒絕服務攻擊。除非您知道它會長時間處於空閒狀態 - 例如,如果您每天只向用戶發送一次通知,則應該打開一個連接,否則每天都會使用新連接是可以接受的做法。

相關問題