Почему System.Net.ServicePoint.ConnectionLimit использует "7FFFFFFF" (Int32.MaxValue/2147483647), когда клиент подключается к службе на "localhost"?

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

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

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

Мои вопросы):

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

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

Как и где было создано TCP-соединение в httpwebrequest и как оно связано с точкой обслуживания?

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 - просто заполнитель без ограничений. Вы должны иметь возможность создавать столько связей с самим собой, сколько вам нужно.

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

Другие вопросы по тегам