7

为什么当客户端连接到'localhost'上的服务时System.Net.ServicePoint.ConnectionLimit 使用'7FFFFFFF' (Int32.MaxValue/2147483647),而如果服务在远程计算机上运行,​​它决定使用 '2' 作为默认值?

最初我认为如果 servicepoint.connectionlimit 未设置,它将是 ServicePointManager.DefaultConnectionLimit。但是,我刚刚意识到(一旦我从客户那里得到问题),它的 Int32.MaxValue/2147483647。

我已经做了一些研究(详情请参阅下面的链接),但是我找不到它为什么用于 int32.maxvalue。我可以推测它可能是为了更好的性能,因为输入请求和响应消息不会跨越边界。

我的问题:

  1. 如果服务在'localhost'上运行,为什么选择 Int32.MaxValue ?(任何英文解释;)我从反射器复制的代码片段也很棒 - 正如我推测的意图 - 但不完全理解代码:))
  2. 我理解它的性能——但从“2”(默认)到“int32.maxvalue”对我来说听起来很延伸。换句话说,只要请求不通过网络,为什么可以打开尽可能多的 TCP 连接。(换句话说 - 为什么默认为 int32.maxvalue - 它没有副作用)

一些与此相关的有用链接:

在 httpwebrequest 中如何以及在何处创建 TCP 连接,它与 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();
                        }
                    }
                }
            }
        }

问候,

4

1 回答 1

0

Int32.maxvalue 只是一个没有限制的占位符。您应该能够根据需要与自己建立尽可能多的联系。

您粘贴的代码基本上只是检查您是否连接到环回地址,如果是,则返回maxint,如果不是,则返回servicepoint.connectionlimit的值(默认为2,但您可以更改它)

于 2014-04-08T08:29:23.873 回答