2010-03-14 26 views
8

Ho un'applicazione WPF che utilizza i servizi WCF per effettuare chiamate al server.Durata servizio client WCF

Io uso questa struttura nel mio codice per accedere al servizio

private static IProjectWcfService ProjectService 
{ 
    get 
    { 
     _projectServiceFactory = new ProjectWcfServiceFactory(); 
     return _projectServiceFactory.Create(); 
    } 
} 

La Creare sulla fabbrica appare così

public IProjectWcfService Create() 
    { 
     _serviceClient = new ProjectWcfServiceClient(); 

     //ToDo: Need some way of saving username and password 
     _serviceClient.ClientCredentials.UserName.UserName = "MyUsername"; 
     _serviceClient.ClientCredentials.UserName.Password = "MyPassword"; 

     return _serviceClient; 
    } 

Per accedere ai metodi del servizio che uso somethingn simile alla seguente.

ProjectService.Save(dto); 

È un buon approccio per quello che sto cercando di fare? Sto ricevendo un errore che non riesco a rintracciare che penso possa essere realizzato per avere troppe connessioni client di servizio aperte (è possibile?) Avviso Non chiudere mai il client di servizio o riutilizzarlo.

Quale sarebbe la migliore pratica per i client di servizio WCF per le chiamate WPF?

Grazie in anticipo ...

risposta

11

Sei sulla strada giusta, direi ;-)

In sostanza, la creazione del proxy client WCF è un processo in due fasi:

  • creare la channel factory
  • dalla fabbrica di canale, creare il canale reale

Il passaggio n. 1 è piuttosto "costoso" in termini di tempo e sforzo necessari, quindi è sicuramente una buona idea farlo una volta e quindi memorizzare nell'istanza di ProjectWcfServiceFactory da qualche parte nel codice.

Il passaggio 2 è in realtà piuttosto leggero e poiché un canale tra un client e un servizio può cadere in uno "stato di errore" quando si verifica un'eccezione sul server (e quindi deve essere ricreato da zero), il caching del canale reale di per sé è meno desiderabile.

Quindi il miglior prassi comunemente accettata sarebbe:

  • creare la ChannelFactory<T> (nel tuo caso: ProjectWcfServiceFactory) una volta e la cache per più a lungo possibile; fare questo sollevamento pesante solo una volta

  • creare l'attuale Channel (qui: IProjectWcfService) secondo necessità, prima di ogni chiamata. In questo modo, non c'è bisogno di preoccuparsi di controllare il suo stato e ricreare in base alle esigenze

UPDATE: "? Per quanto riguarda la chiusura del canale" chiede Burt ;-) Buon punto !!

La best practice accettata per questo è di avvolgere la vostra chiamata di servizio in un blocco try....catch....finally. La parte più difficile è che, quando si smaltisce il canale, anche le cose possono andare male, quindi è possibile ottenere un'eccezione: ecco perché non è sufficiente racchiuderlo in un blocco using(....).

Quindi, in pratica si ha:

IProjectWcfService client = ChannelFactory.CreateChannel(); 
try 
{ 
    client.MakeYourCall(); 
} 
catch(CommunicationException ce) 
{ 
    // do any exception handling of your own 
} 
finally 
{ 
    ICommunicationObject comObj = ((ICommunicationObject)client); 

    if(comObj.State == CommunicationState.Faulted) 
    { 
     comObj.Abort(); 
    } 
    else 
    { 
     comObj.Close(); 
    } 
} 

E, naturalmente, si potrebbe sicuramente piacevolmente avvolgere questo in un metodo o un metodo di estensione o qualcosa in modo da non dover digitare questo fuori ogni volta che si effettua un servizio chiamata.

UPDATE:

Il libro che consiglio sempre di alzarsi e correre in WCF rapidamente è Learning WCF da Michele Leroux Bustamante. Lei copre tutti gli argomenti necessari, e in un modo molto comprensibile e accessibile. Questo ti insegnerà tutto - nozioni di base, argomenti intermedi, sicurezza, controllo delle transazioni e così via - che devi sapere per scrivere servizi WCF utili e di alta qualità.

Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Gli argomenti più avanzati e più approfondita un'occhiata a WCF sarà coperto da Programming WCF Services da Juval Lowy. Si immerge in tutti i dettagli tecnici e argomenti e presenta "la Bibbia" per la programmazione della WCF.

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

E la chiusura del canale? – Burt

+0

Grazie, questo ha chiarito un po 'le cose, ho davvero bisogno di comprare un libro della WCF (qualsiasi raccomandazione sarebbe gradita). – Burt

+0

Perché la cattura e, infine, essenzialmente le stesse cose, com.bj.Abort? È necessario interrompere la cattura? – Burt

Problemi correlati