2014-05-21 9 views
12

Ich muss eine HttpClient.Timeout Eigenschaft ändern, nachdem es eine Anforderung (en) gemacht hat. Wenn ich versuche, erhalte ich eine Ausnahme:Dynamisch ändern HttpClient.Timeout in .NET

Diese Instanz bereits eine oder mehr Anforderungen begonnen hat. Eigenschaften können nur vor dem Senden der ersten Anfrage geändert werden.

Gibt es eine Möglichkeit, dies zu vermeiden?

+0

Ist die Nachricht nicht klar? –

+0

Setzen Sie es vor der Anfrage? – geedubb

+0

@ L.B., Die Nachricht ist klar. Aber ich frage mich immer noch, ob es einen Trick gibt, um das zu vermeiden. Geedubb, ich muss mich nachher ändern. – AsValeO

Antwort

8

Sie können nicht viel tun, um dies zu ändern. Dies ist nur das Standardverhalten in der HttpClient-Implementierung.

Die Timeout-Eigenschaft muss festgelegt werden, bevor die GetRequestStream oder GetResponse Methode aufgerufen wird. From HttpClient.Timeout Remark Section

Um den Timeout zu ändern, wäre es am besten, eine neue Instanz eines Httpclient zu erstellen.

client = new HttpClient(); 
client.Timeout = 20; //set new timeout 
+2

Vorsicht: Das Erstellen/Entsorgen des 'HttpClient' könnte zu Problemen mit der Socket-Erschöpfung führen: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Monsignor

3

Intern wird die Timeout Eigenschaft wird verwendet, um ein CancellationTokenSource einzurichten, die den Async Betrieb abbrechen, wenn die Zeitüberschreitung erreicht ist. Da einige Überlastungen der HttpClient Methoden CancellationTokens akzeptieren, können wir Hilfsmethoden erstellen, um eine benutzerdefinierte Timeouts für bestimmte Operationen haben:

public async Task<string> GetStringAsync(string requestUri, TimeSpan timeout) 
{ 
    using (var cts = new CancellationTokenSource(timeout)) 
    { 
     HttpResponseMessage response = await _httpClient.GetAsync(requestUri, cts.Token) 
     response.EnsureSuccessStatusCode(); 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 
+2

Beachten Sie, dass ein auf dem HttpClient gesetztes Timeout weiterhin erzwungen wird . Dies kann nur die Zeit reduzieren, die eine Anforderung für eine Zeitüberschreitung benötigt. es kann es nicht erhöhen. –

2

Mangel an Unterstützung für benutzerdefinierte Anforderungsebene Timeouts hat ein Manko von HttpClient in meinem Kopf immer . Wenn Sie nicht über eine kleine Bibliothek Abhängigkeit dagegen, Flurl.Http [Disclaimer: Ich bin der Autor] unterstützt diese direkt:

"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>(); 

Dies ist eine wahre Anforderungsebene Einstellung; alle Anrufe auf den gleichen Host eine gemeinsame HttpClient Instanz unter der Haube, und gleichzeitige Anrufe mit verschiedenen Timeouts nicht in Konflikt verwenden. Es gibt einen konfigurierbaren globalen Standard (anfangs 100 Sekunden, wie HttpClient).