2010-10-01 32 views
5

Tengo un servicio WCF simple con el que me comunico de forma asincrónica.Conexiones WCF que exceden las conexiones máximas cuando se utiliza el patrón asíncrono

Lo que no me gusta es cuando se llama al EndServiceMethod(IASyncResult)

si olvido para llamar al método Close(), el servicio realmente dejar la conexión abierta y luego todas las conexiones restantes fallará después de la WCF alcanza su máximo las conexiones simultáneas cuentan con excepciones de tiempo de espera.

He intentado utilizar el atributo [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] en el contrato de servicio, que no parece tener ningún efecto en el estado de la conexión del servicio.

Quizás lo he implementado incorrectamente?

Cualquier idea o sugerencia.

Estoy tratando de encontrar un patrón de comportamiento para el WCF que permita a los clientes realizar una solicitud, y luego el servidor responda a la solicitud y luego suponga que la conexión ha finalizado y puede finalizar.

Respuesta

4

Esto es realmente un problema espinoso.

Por un lado, si no cierra la conexión, permanecerá abierta hasta que se agote el tiempo de espera (1 min), bajo carga alcanzará las conexiones máximas (valor predeterminado 10).

Por otro lado, está llamando a los servicios de forma asíncrona, por lo que si cierra la conexión antes de que se reciba la devolución de llamada, se perderá la devolución de llamada.

Hay algunas cosas que usted podría intentar:

  • aumentar las conexiones max
  • cerrar la conexión en el controlador de devolución de llamada
  • reducir la duración del tiempo de espera
+0

he estado cerrándola en el manejador de devolución de llamada y que parece funcionar. Supongo que esperaba una solución más elegante que permita que esto funcione en el lado del servidor. – Beta033

+0

Esa es realmente la mejor solución. Dependiendo de su código, puede contar el número de manejadores de devolución de llamada y el número de veces que ha llamado para ver si coinciden. –

+0

Excepto porque voy a tener muchos clientes, posiblemente con varias conexiones. ¿Cómo hacen los servicios públicos de wcf? No puedo imaginar que esperen que sus clientes siempre sean buenos para cerrar las conexiones cuando terminen. – Beta033

0

I no sé si esto ayuda:

Puede establecer el enlace de modo que

  • seguridad está establecido en ninguno
  • sesiones fiables son discapacitados

    <wsHttpBinding> 
         <binding name="MyWsHttpBinding"> 
          <reliableSession enabled="false"/> 
          <security mode="None" /> 
         </binding> 
        </wsHttpBinding> 
    

He descubierto que al hacer esto puedo abrir un número ilimitado de canales y "olvidar" ciérralos

Luego debe preguntar si esa es una configuración aceptable para sus circunstancias.

0

Cerrar cualquier tipo de conexión cuando ya no la necesite es solo responsabilidad básica del desarrollador. No hay nada de qué quejarse. Cierre la conexión y no tendrá este problema. Tratar de resolver llamadas faltantes de otra manera es una tontería.

+0

creo que te estás perdiendo el punto. el objetivo era permitir que el servidor manejara esto y no forzar al cliente a mantenerlo. De esa forma, las fallas de comunicaciones catastróficas no dejarían la conexión abierta en el servidor y ocuparían un espacio. – Beta033

+0

No, yo no soy. Las llamadas asincrónicas no reemplazan las necesidades de cierre de la conexión. Por cierto. Usted mencionó que la creación de PerCall no funciona para usted. ¿Qué enlace estás usando? Las instancias de PerCall solo funcionan con enlaces que no usan sesiones de transporte, confiables o de seguridad. –

0

No utilizaría el patrón Asincrónico con WCF.En cambio, solo usaría llamadas sincrónicas con bloques de uso normal para asegurar que la conexión esté cerrada. Luego, envolvería todo el desorden en una tarea normal (.NET 4.0) o elemento de trabajo ThreadPool.

+0

Estoy empezando a convencerme de que usar llamadas wcf sincronizadas envueltas en un hilo de trabajo va a ser la forma de simular la comunicación asíncrona. Gracias. – Beta033

Cuestiones relacionadas