У меня есть приложение ASP.NET 4.0, работающее поверх IIS 7.5 на 64-разрядной машине Windows Server 2008 R2 Enterprise с кусками ОЗУ, ЦП, диска и т.д.
При каждом веб-запросе приложение ASP.NET подключается к веб-службе бэкэнд (через сырые сокеты), которая работает на одном компьютере.
Проблема:. Кажется, что-то ограничивает количество одновременных подключений к веб-службе бэкэнд. Подозрительно, количество параллельных соединений заканчивается на 16.
Я нашел эту ключевую статью от Microsoft, объясняющую, как настроить настройки IIS для размещения приложений ASP.NET, которые создают множество запросов веб-сервисов: http://support.microsoft.com/?id=821268#tocHeadRef
Я следил за рекомендациями по статье, но до сих пор не повезло. Особенно интересной является настройка maxconnection
, которую я даже набрал до 999.
Любые идеи о том, что еще может дросселировать соединения?
Примечание.. Когда я вырезаю IIS из состава и подключаю клиентов напрямую к веб-службе бэкэнда, он с радостью откроет столько подключений, сколько мне нужно, поэтому я уверен, что бэкэнд не является узким местом. Это должно быть что-то в 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>