2016-01-06 90 views
0

在一個Xamarin.Forms應用程序中,我嘗試連接到Exosites api(這不是項目的一部分,所以我不能更改那個,所以SignalR左右)。Xamarin HttpClient請求超時

這對於「正常」請求都可以正常工作。

該API還支持長輪詢請求 - 在manual它說,客戶端必須設置頭「請求超時」的請求。

var client = new HttpClient(); 
var request = new HttpRequestMessage(HttpMethod.Get, requestUri); 
request.Headers.Add("Request-Timeout", "10000"); 
var response = await client.SendAsync(request); 

但是這樣做,我沒有得到任何答案,即使我將超時設置爲非常小的值,如1(毫秒)。如果我設置一個超時請求到Exosites上的另一個端點,它不檢查它,它工作正常。發送沒有「Request-Timeout」頭的完全相同的請求也可以正常工作。

有沒有人在使用HttpClient的Xamarin中進行長輪詢調用的經驗?

非常感謝!

tschuege

回答

1

我終於明白「Request-Timeout」不是標準頭文件。這是一個自定義標題,Exosite用它來區分長期民意調查和普通調查。

我遇到的問題與此無關。我使用提琴手來捕獲一個長期民意調查,以使用郵差作出的Exosite api。後與由響應傳遞「要求超時」中定義的時間返回並且提琴手呈現以下違反協議:

內容長度不匹配:響應頭指出27個字節,但服務器發送0字節。

所以問題是HttpClient無法處理響應。幸運SendAsync具有過載接受具有MSDN上的以下描述HttpCompletionOption類型的附加參數:

指示是否HttpClient的操作應當被認爲完成或者一旦一個響應是可用的,或讀取整個響應消息後包括內容。

使用HttpCompletionOption.ResponseHeadersRead在讀取響應之前,響應被讀取,在我的情況下,它的工作就像一個魅力。

2

實際上,它比這更容易了很多。

using (var client = new HttpClient()) 
{ 
    client.Timeout = TimeSpan.FromSeconds(_timeoutSeconds); 
} 

PS:一定要始終包您在usingnew HttpClient()塊。

+0

謝謝。據我所知client.Timeout是不同的東西 - 一些HttpClient的內部。我發現它是一個計時器,它在發送請求時啓動,並且在請求返回之前耗盡通知主叫方得到通知。服務器確實參與其中。另一方面,標題「Request-Timeout」被髮送到服務器。在Exosites案例中,服務器不會立即回答,而是等待更改或時間耗盡。我用client.Timeout試了一下,即使沒有變化,也立即得到了答案 - 所以沒有長時間的投票。 – tschuege

+0

這不是每次處理HttpClient的理由。這是很多人http:// stackoverflow常見的錯誤。COM /問題/ 15705092/DO-HttpClient的-和httpclienthandler具備的,要被佈置 –