2014-04-08 7 views
5

Dlaczego System.Net.ServicePoint.ConnectionLimit wykorzystuje „7FFFFFFF” (Int32.MaxValue/2147483647) gdy klient łączy się z usługą na „localhost”, natomiast zdecydujesz się skorzystać z „2” jako domyślne, jeśli usługa działa na zdalnym komputerze?Dlaczego System.Net.ServicePoint.ConnectionLimit używa '7FFFFFFF' (Int32.MaxValue/2147483647), gdy klient łączy się z usługą na 'localhost'?

Początkowo myślałem, że będzie to ServicePointManager.DefaultConnectionLimit, jeśli servicepoint.connectionlimit nie jest ustawiony. Jednakże, właśnie zdałem sobie sprawę (raz mam problem od klienta), że jego Int32.MaxValue/2147483647.

Zrobiłem kilka badań (po szczegóły zobacz poniżej linki), jednak nie mogłem dowiedzieć się, dlaczego używa do int32.maxvalue. Mogę nieco przypuszczać, że to prawdopodobnie zapewnia lepszą wydajność, ponieważ żądania wejściowe i komunikaty odpowiedzi nie przekraczają granic.

Moje pytanie (s):

  1. Dlaczego Int32.MaxValue jeśli usługa jest uruchomiona na 'localhost'? (jakikolwiek wyjaśnienie w języku angielskim;) fragmentu kodu skopiowanego z reflektora jest również świetny - jak się domyślałem intencji - ale nie rozumiem kodu całkowicie :))
  2. Rozumiem, że jest perf - ale z "2" (domyślnie) do "int32.maxvalue" brzmi rozciągająco. Innymi słowy, dlaczego otwieranie tylu połączeń TCP jest dozwolone, o ile żądania nie przechodzą przez sieć. (innymi słowy - dlaczego domyślnie int32.maxvalue - nie ma on skutków ubocznych)

kilka przydatnych linków związanych z tym:

How and where the TCP connection has been created in httpwebrequest, and how is it related to servicepoint?

http://blogs.microsoft.co.il/idof/2011/06/20/servicepointmanagerdefaultconnectionlimit-2-depends/

http://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionlimit(v=vs.110).aspx

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

fragment kodu od reflektor

public int ConnectionLimit 
     { 
      get 
      { 
       if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified)) 
       { 
        lock (this) 
        { 
         if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified)) 
         { 
          IPAddress address = null; 
          if (IPAddress.TryParse(this.m_Host, out address)) 
          { 
           this.m_HostLoopbackGuess = IsAddressListLoopback(new IPAddress[] { address }) ? TriState.True : TriState.False; 
          } 
          else 
          { 
           this.m_HostLoopbackGuess = NclUtilities.GuessWhetherHostIsLoopback(this.m_Host) ? TriState.True : TriState.False; 
          } 
         } 
        } 
       } 
       if (!this.m_UserChangedLimit && !((this.m_IPAddressInfoList == null) ? (this.m_HostLoopbackGuess != TriState.True) : !this.m_IPAddressesAreLoopback)) 
       { 
        return 0x7fffffff; 
       } 
       return this.m_ConnectionLimit; 
      } 
      set 
      { 
       if (value <= 0) 
       { 
        throw new ArgumentOutOfRangeException("value"); 
       } 
       if (!this.m_UserChangedLimit || (this.m_ConnectionLimit != value)) 
       { 
        lock (this) 
        { 
         if (!this.m_UserChangedLimit || (this.m_ConnectionLimit != value)) 
         { 
          this.m_ConnectionLimit = value; 
          this.m_UserChangedLimit = true; 
          this.ResolveConnectionLimit(); 
         } 
        } 
       } 
      } 
     } 

Pozdrowienia,

Odpowiedz

1

Int32.maxvalue tylko zastępczy bez limitu. Powinieneś być w stanie stworzyć tyle połączeń do siebie, ile potrzebujesz.

Skopiowany przez Ciebie kod po prostu sprawdza, czy łączysz się z adresem pętli zwrotnej, czy nie, a jeśli jesteś, zwraca maxint, jeśli nie, zwraca wartość servicepoint.connectionlimit (2 domyślnie, ale możesz zmień)

+0

Tak, mam to. Moje pytanie, dlaczego zdecydował się użyć jakiegoś symbolu zastępczego dla localhost, podczas gdy dla zdalnych hostów domyślnie jest ustawiony na "ServicePointManager.DefaultConnectionLimit", na wypadek gdyby użytkownik nie zmienił pliku servicepoint.connectionlimit. Prawdopodobnie Microsoft myślał, że "2" jest zbyt niskie dla localhosta (powinno być również niskie dla zdalnego), zdecyduj się na aktualizację tylko "localhost" - i nie ma dobrych domyślnych ustawień, a pozostawione do uznania użytkownika, ponieważ zależy od niego na temat przypadków użycia? – Dreamer

+0

Cóż, to tylko zgadywanie, ale w moim przypadku, gdy użyłem tej klasy po raz pierwszy, najpierw przetestowałem na komputerze lokalnym, a potem znalazłem problem z łączem podczas próby dostępu na zdalnym. To zmusza do myślenia o liczbie połączeń, które chcesz dopuścić w odpowiednim czasie, zamiast prosić o ograniczenie limitu na tworzenie, gdzie prawdopodobnie wprowadziłbym dowolną wartość bez większego zastanowienia. – Hamster

Powiązane problemy