asp.net - net - publicar web service en iis
¿Qué está limitando el número de conexiones simultáneas que mi aplicación ASP.NET puede hacer a un servicio web? (7)
Tengo una aplicación ASP.NET 4.0 que se ejecuta sobre IIS 7.5 en una máquina Windows Server 2008 R2 Enterprise de 64 bits con montones de RAM, CPU, disco, etc.
Con cada solicitud web, la aplicación ASP.NET realiza una conexión a un servicio web de fondo (a través de sockets sin formato), que se ejecuta en la misma máquina.
Problema: parece que hay algo que limita el número de conexiones simultáneas al servicio web de backend. Sospechoso, el número de conexiones simultáneas se está superando en 16.
Encontré este artículo clave de Microsoft explicando cómo ajustar la configuración de IIS para acomodar aplicaciones ASP.NET que hacen muchas solicitudes de servicio web: http://support.microsoft.com/?id=821268#tocHeadRef
Seguí las recomendaciones del artículo, pero todavía no tuve suerte. La configuración que es particularmente interesante es la configuración de maxconnection
, que incluso superé a 999.
¿Alguna idea de qué otra cosa podría ser conexiones de estrangulamiento?
Nota: Cuando elimine IIS de la mezcla y haga que los clientes se conecten directamente al servicio web back-end, abrirá felizmente tantas conexiones como necesite, por lo que estoy seguro de que el back-end no es el cuello de botella. Debe ser algo en IIS / ASP.NET-land.
Aquí está la sección relevante de machine.config
que estoy seguro está siendo leída por la aplicación (verificado con 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>
¿Es posible que esté usando una referencia de servicio web basada en WCF? Por defecto, ServiceThrottlingBehavior.MaxConcurrentCalls es 16.
Puede intentar actualizar el elemento <serviceThrottling>
del comportamiento de referencia del servicio
<serviceThrottling
maxConcurrentCalls="999"
maxConcurrentSessions="999"
maxConcurrentInstances="999" />
(Tenga en cuenta que recomendaría la configuración anterior). Consulte ServiceThrottlingBehavior.MaxConcurrentCalls para obtener más información sobre cómo configurar un elemento <behavior>
apropiado.
¿Ha intentado establecer el valor de la propiedad estática DefaultConnectionLimit programáticamente?
Aquí hay una buena fuente de información sobre ese verdadero dolor de cabeza ... ASP.NET Thread Usage en IIS 7.5, IIS 7.0 e IIS 6.0 , con actualizaciones para Framework 4.0.
Consulte la sección "Subprocesamiento" de esta página: http://msdn.microsoft.com/en-us/library/ff647786.aspx , junto con la sección "Conexiones".
¿Has intentado aumentar el atributo maxconnection de tu configuración de processModel?
La mayoría de las respuestas proporcionadas aquí abordan la cantidad de solicitudes entrantes a su servicio web back-end, no la cantidad de solicitudes salientes que puede realizar desde su aplicación ASP.net a su servicio back-end.
No es su servicio web backend lo que está acelerando su tasa de solicitud aquí, es la cantidad de conexiones abiertas que su aplicación de llamada está dispuesta a establecer en el mismo punto final (misma URL).
Puede eliminar esta limitación agregando la siguiente sección de configuración a su archivo machine.config:
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="65535"/>
</connectionManagement>
</system.net>
</configuration>
Por supuesto, puede elegir un número más razonable si lo desea, como 50 o 100 conexiones simultáneas. Pero lo anterior lo abrirá hasta el máximo. También puede especificar una dirección específica para la regla de límite abierto anterior en lugar del ''*'' que indica todas las direcciones.
Documentación de MSDN para System.Net.connectionManagement
Otro gran recurso para entender ConnectManagement en .NET
¡Espero que esto resuelva tu problema!
EDITAR: Vaya, veo que tiene la gestión de conexión mencionada en su código anterior. Dejaré mi información anterior ya que es relevante para futuros investigadores con el mismo problema. Sin embargo, tenga en cuenta que actualmente hay 4 archivos machine.config diferentes en la mayoría de los servidores actualizados.
Hay .NET Framework v2 ejecutándose tanto en 32 bits como en 64 bits, así como .NET Framework v4 también se ejecuta con 32 bits y 64 bits. Dependiendo de la configuración elegida para su grupo de aplicaciones, ¡podría estar usando cualquiera de estos 4 archivos machine.config diferentes! Verifique los 4 archivos machine.config que se encuentran generalmente aquí:
- 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
Me doy cuenta de que la pregunta puede ser bastante antigua, pero dices que el servidor se está ejecutando en el mismo servidor. Eso significa que en un puerto diferente, probablemente distinto del puerto predeterminado 80.
He leído que cuando utiliza el elemento de configuración "connectionManagement", necesita especificar el número de puerto si difiere del 80 predeterminado.
LINK: la configuración de maxConnection puede no funcionar, incluso autoConfig = false en ASP.NET
En segundo lugar, si elige usar la configuración predeterminada (dirección = "*") extendida con su propio valor específico de back-end, ¡podría considerar poner el valor específico primero! De lo contrario, si se realiza una solicitud, * coincide primero y se toma el valor predeterminado de 2 conexiones. Al igual que cuando usas la sección en web.config.
LINK: elemento <remove> para gestión de conexión (configuración de red)
Espero que ayude a alguien.
Si no está definido en el servicio web o aplicación o servidor (apache o IIS) que aloja el consumible del servicio web, entonces podría crear conexiones infinitas hasta que falle.
mientras realizo las pruebas de rendimiento, la medida que utilizo es RPS, es decir, cuántas solicitudes por segundo puede atender el servidor dentro de una latencia aceptable.
teóricamente, un servidor solo puede ejecutar tantas solicitudes al mismo tiempo como número de núcleos.
No parece que el problema sea el modelo de subprocesamiento de ASP.net, ya que puede servir miles de rps. Parece que el problema podría ser tu aplicación. ¿Estás usando alguna primitiva de sincronización?
también cuál es la latencia en sus servicios web, son muy rápidos para responder (dentro de microsegundos), si no es así, es posible que desee considerar las llamadas asincrónicas, por lo que no termina bloqueando
Si esto no aporta algo, entonces puede querer crear un perfil de su código usando visual studio o redgate profiler