2009-07-30 5 views
5

Possiedo una classe controller mvc che utilizza un servizio WCF (WSHttpBinding), a volte più chiamate all'interno di una richiesta http e desidera sapere quanto è costoso creare un client per tale servizio. Va bene creare un'istanza del client per ogni chiamata o dovrei creare una variabile membro nella classe?Instantf client 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(); 
    } 
} 

risposta

1

Se si decide di andare con un membro, si prega di tenere a mente che una volta che viene violata, tutte le chiamate in seguito falliranno. Per quanto ne valga la pena, suggerisco il benchmarking.

3

Creare il client di solito non è un'operazione costosa e terribile - quindi dovresti eseguirlo istintivamente ogni volta che ne hai bisogno (come ha detto anche Steven - se è colpa di un errore, dovrai farlo comunque) .

Se si utilizza ChannelFactory per creare il canale (questo è uno dei modi per farlo), la creazione di ChannelFactory è invece un'operazione piuttosto pesante e che richiede molto tempo, quindi sarebbe una buona idea aggrapparsi a un'istanza ChannelFactory il più a lungo possibile.

Marc

+0

Questo vale ancora per .NET 4.5: http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx –

2

In passato, ho creato una nuova istanza della ChannelFactory <> e client/proxy per ogni chiamata al servizio WCF. Non ho avuto problemi con esso, specialmente non per le prestazioni. L'applicazione che ho scritto è stata distribuita su una rete aziendale interna (LAN locale) in cui circa 30 client Windows Form si collegavano al mio servizio WCF.

Dai un'occhiata alla seguente domanda Where to trap failed connection on WCF calling class? e la mia risposta ad esso. È fondamentalmente una classe wrapper che gestisce l'istanziazione client/proxy e fa un sacco di gestione degli errori necessaria per superare alcune carenze nella progettazione di WCF (maggiori informazioni nella domanda collegata).

È possibile riscriverlo o avvolgerlo ulteriormente in un altro stabilimento, in modo da poter memorizzare in cache ChannelFactory e client/proxy se si è preoccupati delle prestazioni. Ho "sentito" che è una cattiva idea memorizzare nella cache ChannelFactory o client/proxy - tuttavia, sono aperto alla correzione qui.