什么限制了我的ASP.NET应用程序可以对Web服务进行的同时连接的数量?

Rob*_*ers 88 asp.net iis web-services

我有一个ASP.NET 4.0应用程序在64位Windows Server 2008 R2企业版机器上的IIS 7.5上运行,有大量的RAM,CPU,磁盘等.

对于每个Web请求,ASP.NET应用程序都连接到后端Web服务(通过原始套接字),该服务在同一台机器上运行.

问题:似乎存在限制后端Web服务的同时连接数的问题.可疑的是,并发连接数达到了16.

我发现微软的这篇重要文章解释了如何调整IIS的设置以容纳产生大量Web服务请求的ASP.NET应用程序:http://support.microsoft.com/?id = 821268 #tocHeadRef

我按照文章的推荐,但仍然没有运气.设置特别有趣的是maxconnection设置,我甚至碰到了999.

任何想法还有可能被节流的连接?

注意:当我从混合中删除IIS并让客户端直接连接到后端Web服务时,它将很乐意打开尽可能多的连接,所以我很肯定后端不是瓶颈.它必须是IIS/ASP.NET-land中的东西.

以下machine.config是应用程序正在阅读的相关部分(经过验证appcmd.exe):

<system.web>
    <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
    <httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>

    <httpHandlers />

    <membership>
        <providers>
            <add name="AspNetSqlMembershipProvider"
                type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                connectionStringName="LocalSqlServer"
                enablePasswordRetrieval="false"
                enablePasswordReset="true"
                requiresQuestionAndAnswer="true"
                applicationName="/"
                requiresUniqueEmail="false"
                passwordFormat="Hashed"
                maxInvalidPasswordAttempts="5"
                minRequiredPasswordLength="7"
                minRequiredNonalphanumericCharacters="1"
                passwordAttemptWindow="10"
                passwordStrengthRegularExpression="" />
        </providers>
    </membership>

    <profile>
        <providers>
            <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </profile>

    <roleManager>
        <providers>
            <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
                type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <add name="AspNetWindowsTokenRoleProvider" applicationName="/"
                type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </roleManager>
</system.web>
<system.net>
    <connectionManagement>
        <add address="*" maxconnection="999"/>
    </connectionManagement>
</system.net>
Run Code Online (Sandbox Code Playgroud)

Ben*_*yne 101

此处提供的大多数答案都解决了对后端Web服务的传入请求数,而不是您可以从ASP.net应用程序向后端服务发出的传出请求数.

这不是你的后端web服务限制你的请求率,它是你的调用应用程序愿意建立到同一端点(相同的URL)的开放连接的数量.

您可以通过将以下配置部分添加到machine.config文件来消除此限制:

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="65535"/>
    </connectionManagement>
  </system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

如果你想要50或100个并发连接,你当然可以选择一个更合理的数字.但是上面会打开它直到最大.您还可以为上面的开放限制规则指定特定地址,而不是指示所有地址的"*".

System.Net.connectionManagement的MSDN文档

另一个了解.NET中ConnectManagement的重要资源

希望这能解决你的问题!

编辑:哎呀,我看到你有上面的代码中提到的连接管理.我将留下我的上述信息,因为它与未来的查询者有相同的问题.但请注意,大多数最新服务器上目前有4种不同的machine.config文件!

在32位和64位下运行.NET Framework v2以及在32位和64位下运行的.NET Framework v4.根据您为应用程序池选择的设置,您可以使用这4个不同的machine.config文件中的任何一个!请检查通常位于此处的所有4个machine.config文件:

  • C:\ WINDOWS\Microsoft.NET \框架\ V2.0.50727\CONFIG
  • C:\ WINDOWS\Microsoft.NET\Framework64\V2.0.50727\CONFIG
  • C:\ WINDOWS\Microsoft.NET \框架\ v4.0.30319\Config中
  • C:\ WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Config中


小智 7

我意识到问题可能相当陈旧,但你说后端运行在同一台服务器上.这意味着在不同的端口上,可能不是默认端口80.

我已经读过,当您使用"connectionManagement"配置元素时,如果端口号与默认值80不同,则需要指定端口号.

LINK:在ASP.NET中,maxConnection设置甚至可能无法工作autoConfig = false

其次,如果您选择使用使用您自己的后端特定值扩展的默认配置(address ="*"),您可以考虑将特定值放在第一位!否则,如果发出请求,则*首先匹配,并且默认采用2个连接.就像在web.config中使用该部分一样.

LINK:<remove>连接管理元素(网络设置)

希望它可以帮助某人.


Rub*_*ben 5

您可能正在使用基于WCF的Web服务引用吗?默认情况下,ServiceThrottlingBehavior.MaxConcurrentCalls为16.

您可以尝试更新服务引用行为的<serviceThrottling>元素

<serviceThrottling
    maxConcurrentCalls="999" 
    maxConcurrentSessions="999" 
    maxConcurrentInstances="999" />
Run Code Online (Sandbox Code Playgroud)

(请注意,我建议使用上面的设置.)有关如何配置适当元素的更多信息,请参阅MSDN<behavior>.


Mat*_*ans 2

请参阅本页的“线程”部分:http://msdn.microsoft.com/en-us/library/ff647786.aspx以及“连接”部分。

您是否尝试过提高 processModel 设置的 maxconnection 属性?