2008-12-26 7 views
2

Version courte: Lorsque j'ai créé un canal à l'aide de ChannelFactory sur un client qui utilise la communication duplex, dois-je garder le canal ouvert pour recevoir le rappel ou puis-je appeler ChannelFactory.Fermer()?Un canal ouvert est-il nécessaire pour la communication duplex?

Version longue: Je développe mon premier service WCF et j'ai créé ma propre classe ClientProxy, qui implémente et fusionne plusieurs services différents en un seul. J'utilise un ChannelFactory pour créer chaque canal, et ma lecture générale sur le net a indiqué que je devrais mettre en cache le ChannelFactory, mais je devrais seulement ouvrir et fermer le canal actuel quand c'est nécessaire. J'appelle donc ChannelFactory.Open pour ouvrir un canal et effectuer une opération duplex (opération unidirectionnelle qui appelle plus tard un rappel). Dois-je fermer ce canal en appelant ChannelFactory.Fermer après avoir demandé l'opération, et si oui, est-ce que je recevrai toujours le rappel?

Les tests de base semblent indiquer que je recevrai le rappel si je ferme la connexion mais je veux juste être sûr. Aussi, cette méthode de mise en cache de ChannelFactory est-elle correcte?

Merci

Répondre

4

Vous devez garder le proxy côté client ouvert pendant que vous souhaitez recevoir callbacks et quand vous devez faire fermer le canal.

Voici une citation du grand livre Programmation services WCF par Juval Lowy (je vous suggère de lire tout le chapitre sur callbacks):

5.3.4. Gestion des connexions de rappel

Le mécanisme de rappel ne fournit rien comme un protocole de niveau supérieur pour la gestion de la connexion entre le service et le point de terminaison de rappel. C'est au développeur de proposer un protocole au niveau de l'application ou un modèle cohérent pour gérer le cycle de vie de la connexion. Comme mentionné précédemment, le service peut uniquement rappeler le client si le canal côté client est toujours ouvert, généralement en ne fermant pas le proxy. Si vous gardez le proxy ouvert, vous éviterez également que l'objet de rappel ne soit récupéré. Si le service maintient une référence sur un point de terminaison de rappel et que le proxy côté client est fermé ou que l'application cliente elle-même est supprimée, lorsque le service appelle le rappel, il reçoit une exception ObjectDisposedException du canal de service. Il est donc préférable que le client informe le service lorsqu'il ne souhaite plus recevoir de rappels ou lorsque l'application cliente s'arrête. Pour ce faire, vous pouvez ajouter une méthode Disconnect() explicite au contrat de service. Comme chaque appel de méthode contient la référence de rappel, dans la méthode Disconnect(), le service peut supprimer la référence de rappel de son magasin interne.