我有一个运行在IIS7.5之上的ASP.NET 4.0应用程序,运行在64位的Windows Server2008 R2企业版机器上,有大量的内存、处理器、磁盘等。
对于每个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>
发布于 2011-10-26 12:19:15
这里提供的大多数答案都是针对后端here服务的传入请求数量,而不是您可以从ASP.net应用程序向后端服务发出的请求数量。
在这里,并不是你的后端URL服务在限制你的请求速率,而是你的调用应用程序愿意建立到相同端点(相同URL)的开放连接的数量。
您可以通过在machine.config文件中添加以下配置节来消除此限制:
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="65535"/>
</connectionManagement>
</system.net>
</configuration>
当然,如果您愿意,也可以选择一个更合理的数字,比如50或100个并发连接。但是上面的代码会让它直接打开到max。您还可以为上面的开放限制规则指定特定地址,而不是表示所有地址的“*”。
MSDN Documentation for System.Net.connectionManagement
Another Great Resource for understanding ConnectManagement in .NET
希望这能解决你的问题!
编辑: Oops,我确实看到你在上面的代码中提到了连接管理。我会留下我的上述信息,因为它是相关的,以供将来有同样的问题的询问者。但是,请注意目前在最新的服务器上有4个不同的machine.config文件!
.NET框架v2可以在32位和64位下运行,.NET框架v4也可以在32位和64位下运行。根据您为应用程序池选择的设置,您可以使用这4个不同的machine.config文件中的任何一个!请检查通常位于以下位置的所有4个machine.config文件:
发布于 2014-10-15 20:57:08
我知道这个问题可能有点老了,但是你说后端运行在同一台服务器上。这意味着在不同的端口上,可能不是默认端口80。
我读到过,当您使用"connectionManagement“配置元素时,如果端口号不同于默认的80,则需要指定端口号。
链接:maxConnection setting may not work even autoConfig = false in ASP.NET
其次,如果您选择使用默认配置(address="*"),并且扩展了您自己的后端特定值,那么您可以考虑将特定值放在第一位!否则,如果发出请求,*将首先匹配,并采用默认的2个连接。就像使用web.config中的节一样。
链接: Element for connectionManagement (Network Settings)
希望这能帮助到别人。
发布于 2011-10-25 00:57:56
有没有可能您正在使用基于WCF的web服务引用?默认情况下,ServiceThrottlingBehavior.MaxConcurrentCalls为16。
您可以尝试更新服务引用行为的<serviceThrottling>
元素
<serviceThrottling
maxConcurrentCalls="999"
maxConcurrentSessions="999"
maxConcurrentInstances="999" />
(请注意,我建议使用上面的设置。)有关如何配置适当的<behavior>
元素的详细信息,请参阅MSDN。
https://stackoverflow.com/questions/7849884
复制相似问题