2013-08-27 15 views
7

Utworzono zasób REST, korzystając z interfejsu Web API działającego jako samohostowany proces. Ze względu na wydajność chciałbym móc wywołać go przy użyciu trwałych połączeń HTTP. Używam samo-hostingu OWIN.Czy jest możliwe korzystanie z trwałych połączeń z System.Net.Http.HttpClient?

Bardzo podoba mi się metody asnyc dla GET, POST, PUT, DELETE w System.Net.Http.HttpClient. Są łatwe do wywołania i radzenia sobie z nimi - zwracają funkcję System.Threading.Tasks.Task, która jest wygodna dla tego, co próbuję zrobić. Wolę używać HttpClient do System.Net.HttpWebRequest.

Prawdopodobnie brakuje mi czegoś, ale nie jest dla mnie jasne, jak utworzyć trwałe połączenia z HttpClient. Przeszukuję klasy System.Net.Http.HttpClientHandler i System.Net.Http.WebRequestHandler, ale do tej pory nie znalazłem opcji trwałych połączeń. Google znajduje wszelkiego rodzaju przykłady tworzenia trwałych połączeń za pomocą HttpWebRequest. Ma właściwość KeepAlive, którą można ustawić na true. Czy istnieje sposób ustawić to za pomocą HttpClient?

MSDN documentation for HttpClient:

Domyślnie HttpWebRequest zostaną wykorzystane do wysyłania żądań do serwera. To zachowanie można zmodyfikować, określając inny kanał w jednym z przeciążeń konstruktora, przyjmując jako parametr instancję HttpMessageHandler. Jeśli wymagane są funkcje, takie jak uwierzytelnianie lub buforowanie, można użyć WebRequestHandler do skonfigurowania ustawień, a instancja może zostać przekazana do konstruktora. Zwróconą procedurę obsługi można przekazać do jednego z przeciążeń konstruktora, pobierając parametr HttpMessageHandler.

Czy istnieje sposób ustawienia funkcji KeepAlive na ukrytym HttpWebRequest?

dokumentacji MSDN mówi:

HttpClient instancja klasy działa jako sesji do wysyłania żądań HTTP. Instancja HttpClient to zbiór ustawień zastosowanych do wszystkich żądań wykonywanych przez tę instancję. Ponadto każda instancja HttpClient używa własnej puli połączeń, izolując jej żądania od żądań wykonywanych przez inne instancje HttpClient.

Czy mogę zrozumieć, że pula połączeń zoptymalizuje się dla mnie przy użyciu trwałych połączeń, gdy można uzyskać korzyści związane z wydajnością? Co się stanie, jeśli chcę, aby zawsze istniało jedno połączenie od mojego klienta?

+0

Cześć! czy w końcu dowiadujesz się, czy to możliwe? – vtortola

+0

Minęło trochę czasu, odkąd na to patrzyłem. O ile mi wiadomo, po prostu nie jest to możliwe. Próbowałem wielu rzeczy, ale bez względu na to, co próbowałem, http.sys zabijało moje połączenie po 120 sekundach, ponieważ nie było na nim ruchu. Nigdy nie znalazłem sposobu na skonfigurowanie połączenia w warstwie .NET w celu zmodyfikowania tego zachowania niskiego poziomu za pomocą HTTP KeepAlive lub cokolwiek innego. Chciałbym mieć kogoś, z kim powinienem odpowiedzieć. – petrsnd

+0

Wystarczająco fair. Dzięki. – vtortola

Odpowiedz

0

Nie jestem pewien, co dokładnie próbujesz rozwiązać, ale czy spojrzałeś na SignalR? Mają dość fantazyjne aplikacje webowe, które mogą wykonać pracę, której szukasz.

Jeśli nie korzystasz z .NET 4.5, to mają alternatywne mechanizmy. Jeden, który widziałem, że jest używany, jest czymś w rodzaju serwera/strumienia zdarzeń.

+0

Nie jestem pewien, dlaczego -1, ale jeśli zastosowałeś się do mojej porady, może okazać się, że ich implementacje IHttpClient są interesujące. – Developer

0

Będziesz musiał ustawić czas MaxIdle w ServicePoint dla klienta. Najprostszym sposobem jest ustawienie limitu czasu dla wszystkich punktów usługowych:

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite; 

Można również ustawić ją na przyłączenie do określonego punktu końcowego

var sp = ServicePointManager.FindServicePoint(targetUri); 
sp.MasIdleTime = Timeout.Infinite; 
Powiązane problemy