2017-10-22 37 views
6

Aby ponownie wykorzystać otwarte połączenia TCP za pomocą HttpClient, należy udostępnić pojedynczą instancję dla wszystkich żądań.Ponowne używanie HttpClient, ale z innym ustawieniem limitu czasu na żądanie?

Oznacza to, że możemy nie może po prostu utworzyć HttpClient z różnymi ustawieniami (np. Timeout lub nagłówki).

W jaki sposób możemy udostępnić połączenia i korzystać z różnych ustawień w tym samym czasie? Było to bardzo łatwe, w rzeczywistości domyślne, ze starszą infrastrukturą HttpWebRequest i WebClient.

Należy pamiętać, że po prostu ustawienie HttpClient.Timeout przed wysłaniem żądania nie jest bezpieczne dla wątków i nie działałoby w aplikacji współbieżnej (np. W witrynie ASP.NET).

+1

Jakie ustawienia szukasz zmieniać na tym samym przykład innym niż 'Timeout'? Rzeczy takie jak nagłówki są ustawiane na żądanie, a zmiana "BaseAddress" nie ma większego sensu, ponieważ każdy inny będzie wymagał nowego połączenia. Praktycznie rzecz biorąc, 'Timeout' może być właściwością _only_, którą chcesz zmienić w tym samym wystąpieniu. Mogę pokazać ci, jak używać innego limitu czasu na żądanie, jeśli to odpowiada na pytanie. –

+0

@ToddMenier to dobry punkt. To by odpowiadało na pytanie, tak! – boot4life

+0

Należy wyjaśnić, że ponowne użycie 'HttpClient' oznacza, że ​​korzystasz z połączenia _single_ TCP. Nie ma tu miejsca na "łączenie się". –

Odpowiedz

7

Pod maską, HttpClient po prostu używa tokenu anulowania, aby zaimplementować zachowanie limitu czasu. Można zrobić to samo bezpośrednio, jeśli chcesz go zmieniać na życzenie:

var cts = new CancellationTokenSource(); 
cts.CancelAfter(TimeSpan.FromSeconds(30)); 
await httpClient.GetAsync("http://www.google.com", cts.Token); 

Zauważ, że domyślny limit czasu dla HttpClient wynosi 100 sekund, a wniosek nadal będzie anulowana w tym momencie nawet jeśli masz ustawioną wyższa wartość na poziomie żądania. Aby rozwiązać ten problem, należy ustawić „max” czas oczekiwania na HttpClient, który może być nieskończony:

httpClient.Timeout = System.Threading.Timeout.InfiniteTimeSpan; 
+0

Jak wspomniano w innej odpowiedzi, może to tylko skrócić czas anulowania. Dlatego, jeśli planujesz używać tej metody, najlepiej jest ustawić domyślny limit czasu na nieskończony (lub inną kwotę, z której możesz być zadowolony) i zaplanować dostarczanie tokena anulowania do każdego i ** każdego ** żądania . – crush

+0

Dobra uwaga. Odpowiedź zaktualizowana. –