25 votes

ChannelFactory.Près VS IClientChannel.Fermer

Considérons le code suivant qui est typcial de nombreux ChannelFactory exemples:

WSHttpBinding myBinding = new WSHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress(
   ConfigurationSettings.AppSettings["HelloWorldServiceURL"]);  

ChannelFactory<IHelloWorldService> myChannelFactory = 
   new ChannelFactory<IHelloWorldService>(myBinding, myEndpoint);

IHelloWorldService proxy = myChannelFactory.CreateChannel();
((IClientChannel)proxy).Open();
HelloWorldDataContract dc = proxy.SayHello();
((IClientChannel)proxy).Close();

Notez que lors de proxy.Open() est appelé, à la fois le canal de l'etat et de la ChannelFactory de l'état "Ouvert". Lorsque le proxy.Close() est appelée, le canal de l'etat est "fermé", mais le ChannelFactory de l'etat reste "Ouvert".

Doit-on être à la clôture de la ChannelFactory ainsi? Je n'ai pas l'impression de voir cela dans de nombreux exemples. Également, si possible, veuillez expliquer la différence entre avoir un canal ouvert vs avoir un canal de l'usine ouverte.

En outre, je suis conscient de la IDisposable question, de sorte qu'il peut probablement être ignoré pour l'amour de cette question à moins qu'il ait une incidence directe sur la réponse.

16voto

Aliostad Points 47792

J'ai trouvé la principale réponse inexacte donc je réponds ici.

Évidemment, Microsoft a fait un absolu désordre de Channles et les Usines et les Clients. La Documentation n'est pas aussi utile, car ils semblent être là juste pour couvrir les dégâts j'ai donc eu recours à des tests.

Avec les problèmes de performance concernant la non-mise en cache des Canaux, la mise en œuvre changé en v3.5 à aborder ces questions et ajouté au cache, mais qui ne fait que compliquer le problème.

Le point est le canal en ChannelFactory est en fait pas différent de la voie utilisée par IClientChannel lorsque vous créez un canal à l'aide d' ChannelFactory.CreateChannel(). C'est tout de même pot. Ne me croyez pas? Essayez:

ChannelFactory<IService> factory = new ChannelFactory<IService>();
// ...
IService service = factory.CreateChannel();
factory.Close();
service.DoIt() // Throws object disposed exception

Alors, vraiment, à l'interne, il est tout de même canal. Personnellement, j'ai commencé à disposer du canal des usines et non pas client de canaux et n'ont pas rencontré de problème. J'ai aussi essayé de faire cela dans une boucle avec la création de 100000 client chaînes, et que la fermeture ChannelFactory.

11voto

JP Alioto Points 33482

Comme vous le savez, le ChannelFactory crée le client de canal en fonction de la configuration. Vous pouvez créer plusieurs canaux à partir d'une usine existante (pour le même effet comme c'est verrouillé). Si vous avez fini d'utiliser l'usine à créer des canaux, il n'y a aucune raison de ne pas le fermer.

Mais, pourquoi vous voulez le garder ouvert? Voici un intéressant article sur WCF clients qui dit:

De vérifier la valeur de la Système.ServiceModel.ICommunicationObject.État la propriété est une condition de concurrence et est pas recommandé pour déterminer si pour la réutilisation ou la fermeture d'un canal.

Plutôt que de réutiliser un canal, vous pouvez simplement créer un nouveau avec le canal de l'usine. Plus sur l'architecture client est ici.

2voto

Cesar Maiorino Points 341

Une autre option est d'utiliser la statique CreateChannel méthode: msdn.microsoft.com/en-us/library/aa344556.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X