2013-10-17 7 views
1

Envisagez le scénario suivant:Clients WCF, maintenez la référence ou non?

Il existe un service Windows hébergeant un service WCF.

Le service WCF fournit une interface entre les clients et un serveur AppFabric situé sur une machine physiquement différente. Il récupère des objets, fait des calculs dessus et renvoie le meilleur. Les clients 20-30 peuvent se connecter au service en même temps, ce qui n'est pas si important. Quoi de mieux, créer une instance chaque fois qu'une requête est effectuée sur le service ou avoir l'objet client comme membre et appeler des fonctions. Créer une instance litière tout en essayant enfin de bloquer ce que je n'aime pas mais qu'en est-il de la connexion client, quels sont les inconvénients? L'hôte peut-il être redémarré et les clients peuvent-ils encore travailler? Quelle est la manière habituelle/préférée de faire ceci?

try 
{ 
    PreOrderService.PreorderServiceClient proxy = new PreOrderService.PreorderServiceClient("netTcpPreorderService"); 

    List<PreOrder> preOrders = proxy.FindWallet(preOrder.WalletId); 
} 
finally 
{ 
    if (proxy.State != CommunicationState.Faulted) 
    proxy.Close(); 
} 
+1

duplication possible de [Meilleure pratique pour la durée de vie du proxy WCF - ou à quelle fréquence pour fermer un proxy WCF?] (Http://stackoverflow.com/questions/4047524/best-practice-for-wcf-proxy-lifetime-ou -how-souvent-pour-fermer-un-wcf-proxy) – CodeCaster

+1

J'ai eu une réponse que j'ai effacée, parce que plus loin la lecture (c.-à-d. la question en double de CodeCaster, et certains des points que CodeCaster a soulevés dans les commentaires sur ma réponse) m'a montré que ma propre réponse était désemparée. La partie importante que je veux traverser - même si vous faites de votre mandataire un membre de l'objet (assez sûr que vous pouvez toujours), vous aurez toujours besoin d'essayer/catch/enfin autour de chaque appel à travers le proxy. –

Répondre

0

Je préfère faire ce qui suit:

proxy = newServiceReference1.ServiceDataContractTestClient(); 
try 
{ 
    proxy.MetodThrowsException(); 
    proxy.Close(); 
} 
catch 
{ 
    proxy.Abort(); 
    throw; // Or handle exception 
} 

Cela ne se soucie pas si la connexion au serveur a été perdue, et ne jette pas un CommunicationObjectFaultedException quand proxy.MetodThrowsException() brise le serveur.

Si vous trouvez que cela réduit la lisibilité, enveloppez-le dans une méthode séparée.