2017-05-17 218 views
0

我有一個私人類HttpClient。我有一個DoRequest方法來處理我所有的請求,併爲內容/參數提供一個模板對象。到目前爲止,我有2個電話。一個是檢索一個令牌,另一個是獲取其他信息(GetInfo)。我GetInfo方法將需要授權頭設置,所以我做這個調用DoRequest前:HttpClient DefaultRequestHeaders授權異常

this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

當我開始做一個Parallel.For用於負載測試,我開始變得一An item with the same key has already been added例外,有時。現在我明白,標題存儲在字典中,這就是爲什麼我得到例外,但我正在尋找如何解決這個問題的想法,同時保留我的DoRequest設計。我想解決這個問題的方法之一是在我的HttpContent對象中設置標題,但是它存在於我的DoRequest方法中,我現在需要將一個標記參數傳遞給它。我不是說這是世界上最糟糕的事情,但我們正在尋找替代品,如果有的話。

回答

0

我經過深思熟慮這個問題的方法是通過分析我想要的東西。我想重新使用HttpClient,但處置任何授權標頭。我認爲最好的方法是使用HttpRequestMessage並將令牌傳遞給我的DoRequest方法。在我的方法,我這樣做:

HttpRequestMessage reqmsg = new HttpRequestMessage(method, uri); 
reqmsg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token ?? string.Empty); 
reqmsg.Content = formContent; 
0

你可以檢查,看看它是否已經在那裏:

static readonly object _o = new object(); 
... 
lock (_o){ 
    if (!this.Client.DefaultRequestHeaders.Contains("Authorization")) 
     this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
} 
+0

我不知道我是否可以異步信任,因爲它可能不存在毫秒我檢查,然後存在,當我嘗試設置它。 – Pittfall

+0

如果將整個支票包裝在鎖定語句中,則應該是線程安全的。我已經更新了我的答案以反映這一點。 –

+0

我不這麼認爲,那將會使我的呼叫異步化。感謝您嘗試提供幫助,但將令牌傳遞給我的「DoRequest」方法是IMO的更好解決方案。 – Pittfall