2010-08-30 8 views
0

J'ai besoin de conseils sur la meilleure façon de créer un wrapper de proxy client WCF pour le client ASP .NET. Je veux travailler aussi bien avec le contrôle ObjectDataSource sans codage supplémentaire et aussi quand j'ai besoin d'appeler manuellement le service WCF pour obtenir des données. J'ai fondamentalement trouvé deux modèles, mais j'aimerais savoir lequel est le plus efficace.Proxy client WCF pour client ASP .NET

Voici la première enveloppe client

public class Facade1 : IDisposable 
{ 
    private readonly IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

    public List<string> GetData() 
    { 
     proxy.GetData() 
    } 

    public List<string> GetMoreData() 
    { 
     proxy.GetMoreData() 
    } 

    public void Dispose() 
    { 
     ClientProxyFactory.CloseChannel(this.proxy); 
    } 
} 

est une autre enveloppe de WCF maintenant ici.

public class Facade2 
{ 
    public List<string> GetData() 
    { 
     IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

     try 
     { 
      return client.GetData(); 
     } 
     finally 
     { 
      ClientProxyFactory.CloseChannel(proxy);    
     } 
    } 

    public List<string> GetMoreData() 
    { 
     IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

     try 
     { 
      return client.GetMoreData(); 
     } 
     finally 
     { 
      ClientProxyFactory.CloseChannel(proxy);    
     } 
    } 
} 

Dans le premier exemple, il n'y a qu'une seule instance du proxy client et il peut être réutilisé entre les différentes méthodes, mais la classe a besoin de mettre en œuvre IDisposable afin que la procuration peut être mis au rebut correctement par le client. Dans le second exemple, il existe un proxy client par méthode et le client n'a pas à se soucier de disposer du proxy.

La réutilisation de proxy entre différentes méthodes est-elle une bonne solution? Les performances sont-elles atteintes lorsque vous ouvrez/fermez le proxy WCF? (Dans les deux exemples, supposons que ChannelFactory sont mises en cache et nouveau canal est créé à chaque fois via la méthode cached_factory.CreateChannel().)

Par exemple, avec la première enveloppe que je peux faire quelque chose comme:

using (Facade1 facade = new Facade1()) 
{ 
    facade.GetData() 
    ... 
    ... 
    facade.GetMoreData() 
} 

Dans le second exemple, je peux juste instancier ma façade et appeler les méthodes nécessaires sans me soucier de disposer d'un proxy.

Merci à l'avance,

Eric

Répondre

1

Si vous utilisez cette enveloppe pour plusieurs appels au service WCF dans le traitement des requêtes HTTP unique dans votre application ASP.NET que le modèle avec proxy partagé est mieux. Si vous voulez partager le wrapper (le rendre global) alors le second modèle devrait être utilisé.

Les performances de recréation d'un proxy dépendent du type de liaison utilisé et de sa configuration. Par exemple, dans le cas de BasicHttpBinding, la recréation d'un proxy peut être rapide car il existe toujours une connexion HTTP persistante du proxy précédent. Mais dans le cas de WSHttpBinding avec contexte de sécurité, la recréation de proxy signifie une nouvelle prise de contact de sécurité pour une session de sécurité estabilishing.

+0

J'allais créer un assemblage séparé pour le premier wrapper ou le second wrapper, selon celui que je choisirais. Y a-t-il un problème avec le partage d'un wrapper dans le premier modèle? Maintenant, pour les problèmes de performances, le service est hébergé sur Windows 2003 avec wis/IIS6, donc j'utilise basicHttpBinding, mais à l'avenir, nous pouvons mettre à jour vers Windows Server 2008 et l'héberger dans IIS7 où je peux utiliser netTcpBinding avec WAS IIS7. J'aime un peu le premier modèle où le proxy est partagé entre les méthodes. Le seul inconvénient est que le client doit se souvenir de disposer de l'emballage correctement. – Eric