2013-02-26 22 views
6

Dla usługi sieciowej w języku C#, która kontaktuje się z ograniczonym zestawem innych serwerów, chcę utworzyć 1 pulę połączeń HTTP na serwer, z którymi chcę się skontaktować.Czy jest możliwe łączenie połączeń HTTP?

Podstawowa koncepcja przedmiotu:

  • Każda pula powinna otworzyć kilka połączeń (3 połączeń?) Do jego zdalnego serwer i utrzymanie tych połączeń żyje.
  • Maksymalny czas życia powinien zostać użyty w celu odtworzenia (rozłączenia/ponownego połączenia) połączeń ze zdalnym serwerem internetowym, aby zapobiec odłączeniu się zdalnego serwera WWW, zanim to zrobimy.
  • Połączenia nie powinny być tworzone równocześnie, ale z niewielką przerwą między 3 połączeniami, aby recykling nie odbywał się jednocześnie.
  • Jeśli zdalny serwer wciąż rozłącza się nieoczekiwanie, powinien zostać zauważony i powinniśmy się ponownie połączyć.
  • Jeśli ponowne połączenie nie jest możliwe z jakiegoś powodu, ponowienie powinno nastąpić po krótkiej przerwie.

W ten sposób, gdy chcę wysłać HttpWebRequest, mam gotowe do użycia połączenia, oszczędzając czas na skonfigurowanie połączenia w momencie, kiedy chcę go użyć.

W tej chwili nie wiem, czy jest to nawet domyślna funkcja HttpWebRequest. Bardzo przepraszam, jeśli pytam o oczywistość. Googling za to tylko doprowadził mnie do podobnych pytań do Javy.

Pytanie 1: czy jest coś takiego w .NET/C#?

Pytanie 2: jeśli nie, czy jest jakiś zasób informacji o tym w Internecie, o których wiesz?

Pytanie 3: jeśli nie, jak podejść do samego budynku?

+0

Powiązane: [Połączenie TCP HTTP] (http://stackoverflow.com/questions/15077526/http-connection-pooling) – slugster

+0

Przepraszam, jeśli źle zrozumiałem twoje pytanie lub jego kontekst, ale nie jest to po prostu wykonane za pomocą WebSockets/long polling w .NET? SignalR będzie dobrze działać. –

Odpowiedz

3

HttpWebRequest (co w zasadzie oznacza wszystkie interfejsy API Http w .net) korzysta już z puli połączeń domyślnie.

Zobacz klasy ServicePoint i ServicePointManager, jeśli potrzebujesz zarządzać dowolnym z parametrów puli połączeń.

+0

Analizowałem pakiety tcp, aby dowiedzieć się, co się dzieje. Wygląda na to, że HttpWebRequest ponownie korzysta z połączenia, jeśli może obsługiwać utrzymywanie przy życiu, ale nie próbuje aktywnie utrzymywać go przy życiu. Ręcznie (bez C#) Byłem w stanie utrzymać połączenie z Apache'em, wysyłając tylko (nie ma polecenia HTTP NOOP ?!) prosty znak nowej linii "\ n" co 10 sekund, aby uniknąć przekroczenia limitu czasu Apache, ale ja nie Uważam, że to jest oficjalny sposób robienia tego. Mogłem również wykonać żądanie HEAD, które powinno również utrzymać połączenie przy życiu, ale wymaga Keep-Alive i generuje większy ruch –

+0

To, co chciałbym zobaczyć, to aktywne utrzymywanie połączenia (tak jak to, co mogłem zrobić ręcznie). A po tym, jak rozłącza się z jakiegokolwiek powodu (osiągnięty limit czasu, KeepAliveTimout osiągnięty, MaxKeepAliveRequests osiągnięty), to C# połączy się bezpośrednio i nie będzie czekał, aż będę chciał ponownie użyć tego połączenia. –

+0

Ow i BTW. Byłem w stanie zobaczyć, że HttpWebRequest używa tego samego ServicePoint w kółko, kiedy to możliwe. I potwierdził to za pomocą httpWebRequest.ServicePoint.GetHashCode().Ale nawet jeśli połączenie jest rozłączone, zanim wykonasz nowe żądanie, C# po prostu ponownie połączy się cicho i zwróci ten sam kod skrótu. Tak więc ServicePoint i hashcode pozostają takie same, ale jest to nowe połączenie, które niestety dopiero powstaje, gdy próbujesz go użyć. –

Powiązane problemy