2009-07-30 18 views
5

Tengo una clase de controlador mvc que utiliza un servicio WCF (WSHttpBinding), a veces varias llamadas dentro de una solicitud http, y quiero saber qué tan caro es crear un cliente para ese servicio. ¿Está bien crear una instancia del cliente para cada llamada o debería crear una variable miembro en la clase?Instanciación de cliente WCF

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

o

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

Respuesta

1

Si usted decide ir con un miembro, por favor tenga en cuenta que una vez que se pega, todas las llamadas después, se producirá un error. En cuanto a si vale la pena, sugiero una evaluación comparativa.

3

La creación del cliente generalmente no es una operación muy costosa, por lo que debe estar listo para crear instancias cada vez que lo necesite (como mencionó Steven también, si tiene una falla debido a un error, deberá hacerlo de todos modos) .

Si está utilizando ChannelFactory para crear el canal (esa es una de las maneras de hacerlo), crear ChannelFactory por otro lado es una operación bastante pesada y que consume mucho tiempo, por lo que sería una buena idea aferrarse a una instancia de ChannelFactory todo el tiempo que pueda.

Marc

+0

Esto sigue siendo válido para .NET 4.5: http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx –

2

En el pasado, he creado una nueva instancia de la ChannelFactory <> y el cliente/proxy para cada llamada al servicio WCF. No he tenido ningún problema con eso, especialmente no por el rendimiento. La aplicación que escribí se implementó en una red interna de la compañía (LAN local) donde unos 30 clientes de Windows Forms se conectarían a mi servicio WCF.

Eche un vistazo a la siguiente pregunta Where to trap failed connection on WCF calling class? y mi respuesta a la misma. Básicamente es una clase contenedora que maneja la creación de instancias cliente/proxy y maneja muchos errores necesarios para superar ciertas deficiencias en el diseño de WCF (más información en la pregunta vinculada).

Puede volver a escribirlo o ajustarlo más en otra fábrica, para que pueda almacenar en caché ChannelFactory y el cliente/proxy si le preocupa el rendimiento. He "oído" que es una mala idea almacenar en caché ChannelFactory o cliente/proxy; sin embargo, estoy abierto a la corrección aquí.