Почему 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. Я могу предположить, что это возможно для лучшей производительности, так как входные запросы и ответные сообщения не выходят за границы.
Мои вопросы):
- Зачем Int32.MaxValue, если служба работает на "localhost"? (любое объяснение на английском языке;) фрагмента кода, который я скопировал с рефлектора, также замечательно - поскольку я отчасти предположил намерения - но не полностью понял код:))
- Я понимаю это для 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 по умолчанию, но вы можете изменить его)