2012-06-04 15 views
8

Estoy creando una aplicación cliente-servidor WCF. Sin embargo, en mi primera prueba, una simple llamada (el método básicamente sólo return true;) toma mucho tiempo (~ 5 segundos)Las llamadas WCF simples toman mucho tiempo

Me trataron de rastrear, y aquí está una captura de pantalla del rastreo de llamadas enter image description here

Como puede ver entre la línea 2 y 3 hay un lapso de 5 segundos (aunque para ser sincero no sé qué significan las líneas 2 y 3)

En la configuración del cliente (llamante), el enlace es así (principalmente generado por Visual Studio

<wsHttpBinding> 
     <binding name="WSHttpBinding_IAgent" 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"> 
      </security> 
     </binding> 
     </wsHttpBinding> 

y en el servidor

<wsHttpBinding> 
    <binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="16777216" maxReceivedMessageSize="16777216" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="16777216" 
     maxArrayLength="16384" maxBytesPerRead="16384" maxNameTableCharCount="16384" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
     <security mode="None"/> 
    </binding> 

Y la manera en que yo lo llamo algo como esto

var client = new AgentClient(binding, BuildEndpointAddress(hostName, port)); 
for(int i =0; i<10; i++) 
    client.IsAlive(); //this call is very slow despite just returning true; 
    // subsequent calls are also slow so probably not because of wake-up time 

Nota para esta prueba, el servidor y el cliente están en el mismo equipo por lo que no podría ser un problema de red. ¿Alguna idea de lo que está causando la lentitud o cómo puedo encontrar más información para solucionar esto?

+1

¿Es más rápido en llamadas posteriores? Podría estar compilando o "despertando" en la primera llamada. – McGarnagle

+0

no Intenté repetir el cliente de llamada.IsAlive() varias veces, y las llamadas posteriores no muestran ninguna diferencia con respecto al primero. –

+0

@dbaseman Para ser precisos, la duración varía, pero parece ser más aleatoria que sistemática. Por ejemplo, en mi primera prueba, la duración de las llamadas consecutivas (mismo método) fue 4 segundos, 4, 6, 2, 4, 3, 8, y cuando reintenté fue: 9, 3, 2, 4, 5, 5, 3 –

Respuesta

0

Para obtener más información, puede aprovechar Event Tracing para Windows (ETW) con la herramienta Perfmonitor del sitio codeplex del equipo de BCL. Una de las muchas funciones de esta herramienta es que puede muestrear el puntero de instrucción cada milisegundo y proporcionarle la pila de llamadas administradas para cada muestra. Esto puede darle una indicación de lo que el código está haciendo durante esos lapsos de tiempo.

ps. Aquí hay otro enlace a los artículos que usan esta herramienta: http://naveensrinivasan.com/category/net/etw-net/

1

La duración de la aplicación no está especificada en su publicación y asumiré que inicia la aplicación cliente y llama al servicio WCF por primera vez sin calentarlo.

La sincronización tendrá sentido en ese caso.

.NET realiza un montón de trabajo oculto para inicializar ChannelFactory y Server si no se calentó a pesar de utilizar un enlace y un mensaje ligeros.

Esa es la naturaleza de WCF y no debería causar muchos problemas porque después de calentar las comunicaciones son realmente rápidas.

Intente llamar a su servicio dos veces seguidas en una sesión de aplicación para medir el tiempo de ambas llamadas. Si ambas llamadas toman un tiempo comparable, mi suposición es incorrecta.

En caso de que le gustaría ver a mi pregunta y compara medio ambiente -

Why is the first WCF client call slow?

0

intente configurar el registro de seguimiento de WCF - detalles aquí: http://msdn.microsoft.com/en-us/library/ms733025.aspx

que he tenido todo tipo de tirones de pelo -con problemas con WCF, pero ese tipo de problema de rendimiento en el mismo cuadro no es algo que haya visto antes. Como han dicho otros, la causa más probable sería el "calentamiento" del servidor, pero si lo llama varias veces, entonces esto no debería ser un problema. ¿Has intentado llamar el código varias veces desde tu aplicación cliente?

Cuestiones relacionadas