asp.net - 是什么限制了我的 ASP.NET 应用程序可以与 Web 服务建立的同时连接数?

标签 asp.net web-services iis

我有一个 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/

相关文章:

asp.net - 如何在LINQ中使用多个order by?

c# - 从 C# 调用 javascript

asp.net - dbo.TempGetStateItemExclusive3 重复调用

asp.net - 可能的 SOAP 版本不匹配

iis - 避免在 IIS 上使用反向代理将 URL 重写到外部应用程序?

c# - 我必须使用哪些 IIS 设置才能通过 WCF 使用自己的密码验证

c# - 将 Bootstrap 类应用于 @Html.DropDownList()

android - retrofit - I/art : Background sticky concurrent mark sweep GC freed

asp.net - Visual Studio 2012 网站 - 使项目文件夹镜像资源管理器

asp.net - ASP.NET 应用程序中的浏览器缓存