2017-05-17 2 views
0

Ich habe eine Klasse, die eine private HttpClient hat. Ich habe eine DoRequest Methode, die alle meine Anfragen behandelt und ein Vorlagenobjekt für den Inhalt/die Parameter nimmt. Bisher habe ich 2 Anrufe. Eine besteht darin, ein Token abzurufen, und eine andere, um andere Informationen zu erhalten (GetInfo). meine GetInfo Methode wird die Autorisierungsheader festlegen muß, so kann ich dies vor DoRequest Aufruf:HttpClient DefaultRequestHeaders Berechtigung Ausnahme

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

Sobald ich ein Parallel.For für einen Belastungstest machen begann, beginne ich eine An item with the same key has already been added Ausnahme bekommen, manchmal. Jetzt verstehe ich, dass die Überschriften in einem Wörterbuch gespeichert werden, und deshalb bekomme ich die Ausnahme, aber ich suche nach Ideen, wie man das löst, während ich meinen DoRequest Entwurf behalte. Ich denke, ein Weg, um es zu lösen, ist die Kopfzeile in meinem HttpContent Objekt, aber das lebt in meiner DoRequest Methode, und ich würde jetzt einen Token-Parameter übergeben müssen. Ich sage nicht, dass das das Schlimmste auf der Welt ist, aber ich suche nach Alternativen, falls welche existieren.

Antwort

0

Die Art, wie ich dachte, dieses Problem durch ist durch die Analyse, was ich wollte. Ich wollte HttpClient wiederverwenden, verfüge jedoch über Autorisierungsheader. Der beste Weg, ich denke, dies zu tun ist, eine HttpRequestMessage zu verwenden und den Token an meine DoRequest Methode zu übergeben. In meiner Methode, ich mache:

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

Sie könnten prüfen und sehen, ob es bereits gibt es:

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

Ich weiß nicht, ob ich das asynchron vertrauen kann, weil es nicht die Millisekunde existieren kann ich überprüfen, und dann gibt es recht, wenn ich versuche, es zu setzen. – Pittfall

+0

Wenn Sie Ihren gesamten Scheck in eine Lock-Anweisung schreiben, sollten Sie threadsicher sein. Ich habe meine Antwort aktualisiert, um dies zu berücksichtigen. –

+0

Ich denke nicht, das würde den ganzen Punkt zerstören, meine Anrufe asynchron zu machen. Danke, dass Sie versuchen zu helfen, aber das Token an meine 'DoRequest' Methode zu übergeben, ist die bessere Lösung IMO. – Pittfall

Verwandte Themen