Incrementar número máximo de conexiones simultáneas en un servicio WCF

Windows Communication Foundation (WCF) es una tecnología para la creación de aplicaciones orientadas a servicios.
Cuando se lanzan muchas peticiones al mismo tiempo desde las aplicaciones cliente sobre un mismo servicio WCF podemos llegar a obtener el siguiente mensaje:
«An error occurred while receiving the HTTP response to http://servidor/MiServicio. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.»
En mi caso, este mensaje se debía a que se estaba sobrepasando el número máximo de conexiones/sesiones simultáneas al servicio (por defecto 16).
Para incrementar este máximo podemos modificar el valor de los atributos maxConcurrentCalls, maxConcurrentSessions y maxConcurrentInstances (líneas 9, 10 y 11) en nuestro archivo de configuración (App.config).
 1. <?xml version="1.0" encoding="utf-8"?>
 2. <configuration>
 3.   <system.serviceModel>
 4.     <behaviors>
 5.       <serviceBehaviors>
 6.         <behavior name="Namespace.MiBehavior">
 7.           <serviceMetadata httpGetEnabled="true" />
 8.           <serviceDebug includeExceptionDetailInFaults="false" />
 9.           <serviceThrottling maxConcurrentCalls="500"
10.               maxConcurrentSessions="500"
11.               maxConcurrentInstances="500"/>
12.         </behavior>
13.       </serviceBehaviors>
14.     </behaviors>
15.     <services>
16.       <service behaviorConfiguration="Namespace.MiBehavior" 
17.                name="Namespace.MiTarea">
18.         <endpoint address="" binding="basicHttpBinding"
19.                contract="Namespace.iMitarea" />
20.         <host>
21.           <baseAddresses>
22.             <add baseAddress="http://servidor/MiServicio" />
23.           </baseAddresses>
24.         </host>
25.       </service>
26.     </services>
27.   </system.serviceModel>
28.   <system.diagnostics>
29.     <sources>
30.       <source name="System.ServiceModel"
31.               switchValue="Information, ActivityTracing"
32.               propagateActivity="true">
33.         <listeners>
34.           <add name="traceListener"
35.                type="System.Diagnostics.XmlWriterTraceListener"
36.                initializeData= "c:\Traces.svclog" />
37.         </listeners>
38.       </source>
39.     </sources>
40.   </system.diagnostics>
41. </configuration>
El significado de cada uno de los atributos es el siguiente:
  • maxConcurrentCalls (16 por defecto) Indica el número máximo de mensajes que puede procesar un objeto ServiceHost.
  • maxConcurrentInstances (16 por defecto) Indica el numero máximo de objetos InstanceContext que se ejecutan simultáneamente dentro de un objeto ServiceHost.
  • maxConcurrentSessions (10 por defecto) Indica el número máximo de sesiones que un objeto ServiceHost puede aceptar.

Yo he modificado todos los valores a 500 para probar y se ha solucionado el problema, pero podéis ajustar mejor según vuestras necesidades. Más información aquí.

Para averiguar el motivo exacto del error tuve que habilitar la traza del servicio WCF. Podéis hacerlo incluyendo las líneas de la 28 a la 40 en el fichero de configuración de vuestra aplicación.
Nuestra puntuación
Twittear
Compartir
Compartir
Pin