2009-07-30 9 views
5

J'ai une classe de contrôleur mvc qui utilise un service WCF (WSHttpBinding), parfois plusieurs appels dans une requête http, et je veux savoir combien il est coûteux de créer un client pour ce service. Est-ce que je peux créer une instance du client pour chaque appel ou dois-je créer une variable membre dans la classe?Instanciation du client WCF

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

ou

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

Répondre

1

Si vous décidez d'aller avec un membre, s'il vous plaît garder à l'esprit qu'une fois qu'il se reprocher, tous les appels après échouera. Quant à savoir si cela en vaut la peine, je suggère l'analyse comparative.

3

La création du client n'est généralement pas une opération très coûteuse - vous devriez donc bien l'instancier quand vous en avez besoin (comme Steven l'a mentionné aussi - si c'est une erreur, vous devrez le faire quand même) .

Si vous utilisez ChannelFactory pour créer le canal (c'est l'une des façons de le faire), créer ChannelFactory est une opération assez lourde et qui prend beaucoup de temps, donc ce serait une bonne idée de accrochez-vous à une instance de ChannelFactory aussi longtemps que vous le pouvez.

Marc

+0

Cela est toujours valable pour .NET 4.5: http://msdn.microsoft.com/fr-fr/library/hh314046(v=vs.110).aspx –

2

Dans le passé, j'ai créé une nouvelle instance de la ChannelFactory <> et le client/proxy pour chaque appel au service WCF. Je n'ai eu aucun problème avec ça, surtout pas pour la performance. L'application que j'ai écrite a été déployée sur un réseau d'entreprise interne (LAN local) où environ 30 clients Windows Forms se connectaient à mon service WCF.

Jetez un oeil à la question suivante Where to trap failed connection on WCF calling class? et ma réponse. C'est essentiellement une classe wrapper qui gère l'instanciation client/proxy et fait beaucoup de gestion des erreurs nécessaires pour surmonter certaines lacunes dans la conception de WCF (plus d'informations dans la question liée).

Vous pouvez le réécrire ou l'intégrer dans une autre usine, de sorte que vous puissiez mettre en cache ChannelFactory et client/proxy si vous êtes préoccupé par les performances. J'ai "entendu" que c'est une mauvaise idée de mettre en cache ChannelFactory ou client/proxy - cependant, je suis ouvert à la correction ici.

Questions connexes