2010-03-14 8 views
8

J'ai une application WPF qui utilise les services WCF pour passer des appels au serveur.Service WCF Client à vie

J'utilise cette propriété dans mon code pour accéder au service

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

Create sur l'usine ressemble à ce

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; 
    } 

Pour accéder aux méthodes de service que j'utilise somethingn comme suit.

ProjectService.Save(dto); 

Est-ce une bonne approche pour ce que j'essaie de faire? Je reçois un message d'erreur que je ne peux pas identifier, car je pense qu'il est possible que trop de connexions de client de service soient ouvertes (est-ce possible?) Notez que je ne ferme jamais le client de service ou ne le réutilise pas.

Quelle serait la meilleure pratique pour les clients de service WCF pour les appels WPF?

Merci à l'avance ...

Répondre

11

Vous êtes sur la bonne voie, je dirais ;-)

Fondamentalement, la création du proxy client WCF est un processus en deux étapes:

  • créer l'usine de canal
  • de l'usine de canal, créer le canal réel

Étape # 1 est assez "cher" en termes de temps et d'efforts nécessaires - donc c'est certainement une bonne idée de le faire une fois et ensuite mettre en cache l'instance de ProjectWcfServiceFactory quelque part dans votre code.

L'étape 2 est en fait assez légère, et puisqu'un canal entre un client et un service peut tomber dans un "état défaillant" lorsqu'une exception se produit sur le serveur (et doit ensuite être recréée à partir de zéro), la mise en cache du canal proprement dit est moins souhaitable.

Donc, la meilleure pratique communément admise serait:

  • créer le ChannelFactory<T> (dans votre cas: ProjectWcfServiceFactory) une fois et le cache aussi longtemps que possible; faire cette lourde charge une seule fois

  • créer le Channel réel (ici: IProjectWcfService) au besoin, avant chaque appel. De cette façon, vous n'avez pas à vous soucier de vérifier son état et de recréer au besoin

MISE À JOUR: « ? Qu'en est-fermeture du canal » demande Burt ;-) Bon point !!

La meilleure pratique acceptée pour cela est d'encapsuler votre appel de service dans un bloc try....catch....finally. La partie délicate est la suivante: lors de la mise au rebut du canal, les choses peuvent mal se passer aussi, donc vous pourriez avoir une exception - c'est pourquoi l'envelopper dans un bloc using(....) n'est pas suffisant.

Donc, fondamentalement, vous avez:

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(); 
    } 
} 

Et bien sûr, vous pourriez certainement envelopper bien cela dans une méthode ou une méthode d'extension ou de quelque chose afin de ne pas taper ce à chaque fois que vous faites un service appel.

MISE À JOUR:

Le livre que je recommande toujours de se lever et courir dans WCF est rapidement Learning WCF par Michele Leroux Bustamante. Elle couvre tous les sujets nécessaires, et d'une manière très compréhensible et accessible. Cela vous apprendra tout - les bases, les sujets intermédiaires, la sécurité, le contrôle des transactions et ainsi de suite - que vous devez savoir pour écrire des services WCF utiles et de haute 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

Les sujets plus avancés et plus en profondeur au regard WCF sera couvert par Programming WCF Services par Juval Lowy. Il plonge vraiment dans tous les détails techniques et sujets et présente «la bible» pour la programmation de 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

Qu'en est-fermeture du canal? – Burt

+0

Merci, cela a éclairci un peu les choses, j'ai vraiment besoin d'acheter un livre WCF (toutes les recommandations seraient les bienvenues). – Burt

+0

Pourquoi la capture est-elle en train de faire essentiellement la même chose, c'est-à-dire comObj.Abort? Y a-t-il un besoin d'avorter dans la prise? – Burt

Questions connexes