我有一个 ASP.NET 4.0 应用程序在 64 位 Windows Server 2008 R2 Enterprise 计算机上的 IIS 7.5 上运行,该计算机具有大量 RAM、CPU、磁盘等。
对于每个 Web 请求,ASP.NET 应用程序都会与在同一台计算机上运行的后端 Web 服务(通过原始套接字)建立连接。
问题:似乎存在某些因素限制了与后端 Web 服务的同时连接数。令人怀疑的是,并发连接数达到了 16 个峰值。
我发现 Microsoft 的这篇重要文章解释了如何调整 IIS 设置以适应发出大量 Web 服务请求的 ASP.NET 应用程序:http://support.microsoft.com/?id=821268#tocHeadRef
我按照文章的建议进行操作,但仍然没有成功。特别有趣的设置是 maxconnection
设置,我什至将其提高到 999。
您知道还有什么可能会限制连接吗?
注意:当我将 IIS 从混合中删除并让客户端直接连接到后端 Web 服务时,它会很高兴地打开我需要的任意数量的连接,所以我确信后端不是瓶颈。它一定是 IIS/ASP.NET 领域的东西。
这是 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>
最佳答案
此处提供的大多数答案都涉及到后端 Web 服务的传入请求数量,而不是您可以从 ASP.net 应用程序发出的传出请求数量您的后端服务。
并不是您的后端 Web 服务在此处限制您的请求速率,而是您的调用应用程序愿意与同一端点(相同 URL)建立的打开连接的数量。
您可以通过将以下配置部分添加到 machine.config 文件中来消除此限制:
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="65535"/>
</connectionManagement>
</system.net>
</configuration>
如果您愿意,您当然可以选择一个更合理的数字,例如 50 或 100 个并发连接。但上面的操作会将其打开到最大。您还可以为上面的开放限制规则指定特定地址,而不是表示所有地址的“*”。
MSDN Documentation for System.Net.connectionManagement
Another Great Resource for understanding ConnectManagement in .NET
希望这能解决您的问题!
编辑:哎呀,我确实看到您在上面的代码中提到了连接管理。我将保留上述信息,因为它与将来遇到相同问题的询问者相关。但是,请注意大多数最新服务器上目前有 4 个不同的 machine.config 文件!
.NET Framework v2 可在 32 位和 64 位下运行,.NET Framework v4 也可在 32 位和 64 位下运行。根据您为应用程序池选择的设置,您可以使用这 4 个不同的 machine.config 文件中的任何一个!请检查通常位于此处的所有 4 个 machine.config 文件:
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG
- C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config
关于asp.net - 是什么限制了我的 ASP.NET 应用程序可以与 Web 服务建立的同时连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849884/