2014-04-08 3 views
5

Почему System.Net.ServicePoint.ConnectionLimit использует «7fffffff» (Int32.MaxValue/2147483647), когда клиент подключается к службе на «локальный», в то время как он решил использовать «2» по умолчанию, если служба работает на удаленной машине?Почему System.Net.ServicePoint.ConnectionLimit использует «7FFFFFFF» (Int32.MaxValue/2147483647), когда клиент подключается к службе на «localhost»?

Первоначально я думал, что это будет ServicePointManager.DefaultConnectionLimit, если servicepoint.connectionlimit не установлен. Однако я просто понял (как только у меня возникла проблема с клиентом), это его Int32.MaxValue/2147483647.

Я провел некоторое исследование (подробности см. Ниже в ссылках), однако я не мог понять, почему он использует значение int32.maxvalue. Я могу догадываться, что он, вероятно, для лучшей производительности, поскольку входные запросы и ответные сообщения не пересекают границу.

Мой вопрос (ы):

  1. Почему Int32.MaxValue если служба запущена на 'локальный'? (любое объяснение на английском языке;) фрагмента кода, которое я скопировал из отражателя, также велико, поскольку я как бы предположил намерения - но не понял код полностью :))
  2. Я понимаю его для перфоманса, но из «2» (по умолчанию) звучит «int32.maxvalue». Другими словами, почему это нормально, чтобы открыть столько TCP-соединений, пока запросы не пересекаются через сеть. (другими словами - почему по умолчанию Int32.MaxValue - не это есть сторона влияет)

Некоторые полезные ссылки, связанные с этим:

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

фрагмент кода из отражателя

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(); 
         } 
        } 
       } 
      } 
     } 

С уважением,

ответ

1

Int32.MaxValue просто заполнитель для каких-либо ограничений. Вы должны иметь возможность создавать столько подключений к себе, сколько вам нужно.

Код, который вы вставили, в основном просто проверяет, подключен ли вы к loopback-адресу или нет, и если вы вернетесь, maxint, если вы нет, возвращает значение servicepoint.connectionlimit (по умолчанию по умолчанию, но вы можете измените его)

+0

Да, я понял. Мой вопрос, почему он решил использовать только один placeholder для localhost, тогда как для удаленных хостов он по умолчанию имеет значение «ServicePointManager.DefaultConnectionLimit», если пользователь не изменит servicepoint.connectionlimit. Вероятно, Microsoft думает, что «2» слишком низок для localhost (он также должен быть низким для удаленного), решите обновить его только «localhost» - и нет хорошего использования по умолчанию, и он оставлен на усмотрение пользователя, поскольку он зависит от в случаях использования? – Dreamer

+0

Ну, это просто угадывание, но в моем случае, когда я впервые использовал этот класс, я сначала тестировал локальный, затем обнаружил проблему connectionlimit при попытке доступа на удаленном компьютере. Таким образом, это заставляет вас задуматься о том, сколько соединений вы хотите разрешить в нужное время, а не запрашивать ограничение соединения при создании экземпляра, где я, вероятно, просто ввел бы любую ценность без особых размышлений – Hamster