2012-06-26 320 views
22

Tengo una pequeña aplicación que usa WCF para comunicarse con un servidor web. Este programa es utilizado por unos 200 clientes, y cada cliente envía entre 5 y 20 solicitudes/min.El canal de solicitud agotó el tiempo de espera mientras esperaba una respuesta

En cuanto a los registros de errores A menudo recibo:

El canal de solicitud de tiempo de espera mientras se espera una respuesta después de 00: 00: 59,9989999

Las solicitudes se hacen de la siguiente manera:

ClientService Client = new ClientService(); 
Client.Open(); 
Client.updateOnline(userID); 
Client.Close(); 

Este es el app.config

<configuration> 
<configSections> 
</configSections> 
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="None"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="PATH TO SERVICE" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService" 
      contract="IClientService" name="WSHttpBinding_IClientService"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

de las "muchas llamadas" cada día aproximadamente 200-800 fallan. Y sobre n-1 están bien. Estoy muy confundido sobre cuál puede ser el problema. Si miramos las estadísticas del servidor, casi no está sudando: cada solicitud tarda 0 segundos en procesarse para procesar <. Los datos que envía consisten en "int" o "cadenas muy pequeñas", por lo tanto, no se debe al tamaño, si lo hubiera, debería haber una falla constante.

Sugerencias?

+0

¿Está host a este servicio en IIS o se fue sede por un servicio de ventanas o alguna otra aplicación? –

+0

¿Has intentado jugar con el tiempo de espera y las configuraciones de cotización en el archivo de configuración? – eulerfx

+0

En realidad, sugiero activar el seguimiento WCF (como se explica aquí: http://msdn.microsoft.com/en-us/library/ms733025.aspx) y revisar los mensajes que se registran cuando aparecen estos errores. –

Respuesta

9

Parece que sus solicitudes se están haciendo cola en el servidor antes de ser manejadas y luego comienza el tiempo de espera. Puede probar algunas cosas aquí para ver exactamente qué está pasando

1) Pruebe la aceleración en sus servicios de WCF, por ejemplo: intente aumentar sus sesiones concurrentes. Eche un vistazo WCF Throttling

2) Pruebe usar PerCall en lugar de usar sesiones aquí para asegurarse de que no quede ninguna sesión allí. Aquí es lo que puede hacer en su interfaz para eliminar sesión

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)] 

y su contrato clases que implementan la interfaz de los

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

Y .... Usted debe habilitar el seguimiento para ver exactamente qué se está encendiendo.

+0

He hecho lo que sugeriste ... y ahora lo dejo funcionar durante 15 minutos aproximadamente Solo un cliente está informando problemas. (Mismo problema de tiempo de espera). Dejaré que se ejecute durante un tiempo y veré si es el único cliente que informa los problemas ahora ... si es así, entonces lo atribuiré a su conexión. . (aka ... es tarde) ... –

3

Compruebe este contador de rendimiento - ASP.NET Requests Queued.

Una aplicación web puede alojar muchas páginas web y servicios. IIS procesa solo 12 solicitudes simultáneas por núcleo de CPU de forma predeterminada.

Esto significa que incluso si su servicio es rápido pero otras páginas/servicios son lentos, su solicitud debe esperar en la cola antes de que se ejecuten.

ASP.NET Requests Queued debe ser cero o cercano a cero.

Ver Performance Counters for ASP.NET on MSDN.

+0

Más de 2 minutos: el máximo de peticiones de ASP.NET en cola es 1 .. Las solicitudes de ASP.NET v4 en cola son 0 (se está ejecutando .NET 4) –

25

Trate de añadir los valores de tiempo de espera para el servicio y el cliente:

<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" 
    sendTimeout="00:10:00" maxBufferPoolSize="2147483647" 
    maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
+1

Funciona. Solución fácil y simple. Lo he configurado en cliente y servicio. Muchas gracias. – FrenkyB

Cuestiones relacionadas