visual test svcutil studio showing open not how example create wcf wcf-client

svcutil - wcf test client visual studio 2017



WCF-fábrica de canales frente a base de clientes (1)

Soy nuevo en WCF. Inicialmente, creé un servicio WCF y usé el proxy del cliente generado para consumir el servicio del cliente. Entonces cada vez que realicé algunas operaciones en el servicio todo se ejecutó secuencialmente ya que estoy invocando operaciones sincrónicamente. Cambié el modo de concurrencia a múltiple, pero aún así las operaciones ocurrieron sincrónicamente. Luego generé métodos asíncronos para mis operaciones y uso los patrones de inicio / final, por lo que supongo que "libere" el canal y dejo que las operaciones sucedan en paralelo / aumentando asincrónicamente el rendimiento de mis aplicaciones.

Luego utilicé ChannelFactory para crear un canal y realicé las operaciones, ya que el cliente y el servidor pueden compartir los contratos (mismo proyecto). Pero IClientChannel solo proporciona BeginOpen/EndOpen/BeignClose/EndClose . No tiene los métodos BeginOperation/EndOperation . Así que, básicamente, no puedo ejecutar una operación de forma asíncrona en el canal para liberarlo, de modo que pueda usar el canal para realizar otras operaciones.

Simplemente creé canales para cada operación y resolvió el problema

Entonces mi pregunta es:

  1. Cuál es mejor ( ClientBase vs. ChannelFactory ) en mi escenario, especialmente quiero realizar múltiples operaciones en el objeto de servicio simultáneamente con múltiples hilos

  2. ¿Es aconsejable crear un canal para cada operación?

  3. De hecho, pensé que podíamos tener un solo canal entre dos puntos finales (cliente / servicio). Pero puedo crear tantos canales como quiera. Por ejemplo: Pude crear Int16.MaxValue de canales. Así que no estoy seguro de cuál es el límite y las recomendaciones sobre esto.

    Service[] channels = new IService[Int16.MaxValue]; for(int i = 0; i<Int16.MaxValue; i++) { channels[i] = factory.CreateChannel(); }

Así que, básicamente, ¿pueden informarme sobre los conceptos básicos de los canales, las recomendaciones, los trucos, etc. ... etc.? :)


Hay una diferencia al usar asincronización entre ClientBase y ChannelFactory<T> . Básicamente, ClientBase usa el modelo asincrónico controlado por eventos.

Utilicé ChannelFactory<T> extensamente en una aplicación que desarrollé en el trabajo, principalmente porque los contratos estaban disponibles en una biblioteca común para la aplicación y no me gusta usar Add Service Reference. Guardo en caché cada instancia única de ChannelFactory en el momento de la creación, y luego, cuando necesito llamar a una operación, abro un canal de comunicación desde esa instancia, realizo mi llamada y cierro el canal de comunicación.

La mayor parte del costo inicial de WCF está en la creación del cliente, y de esta manera solo se paga una vez durante toda la vida de la aplicación; la creación de canales de comunicación es trivial.

Para obtener más información sobre la asincronización para ClientBase y ChannelFactory<T> , consulte:

Cómo: llamar a las operaciones del servicio WCF de forma asíncrona

Cómo: Llamar operaciones de forma asíncrona utilizando una fábrica de canales