2010-04-12 5 views
4

Pour un code de test, je voudrais être en mesure d'accueillir un service WCF en quelques lignes. Je pensais que je serais écrire une simple classe d'hébergement:Est-ce une bonne façon d'accueillir un service WCF?

public class WcfHost<Implementation, Contract> : IDisposable 
    where Implementation : class 
    where Contract : class 
{ 
    public readonly string Address = "net.tcp://localhost:8000/"; 
    private ServiceHost _Host; 

    public WcfHost() 
    { 
     _Host = new ServiceHost (typeof (Implementation)); 

     var binding = new NetTcpBinding(); 
     var address = new Uri (Address); 

     _Host.AddServiceEndpoint (
      typeof (Contract), 
      binding, 
      address); 
     _Host.Open(); 
    } 

    public void Dispose() 
    { 
     ((IDisposable) _Host).Dispose(); 
    } 
} 

qui peut être utilisé comme ceci:

using (var host = new WcfHost<ImplementationClass, ContractClass>()) { 

Y at-il quelque chose de mal avec cette approche? Y a-t-il une faille dans le code (surtout concernant la disposition)?

Répondre

5

La méthode Dispose de l'hôte peut déclencher une exception si l'hôte est dans l'état "faulted". Si cela se produit, vous ne verrez pas ce qui s'est réellement passé car l'exception originale est perdue. Pour le code de test cela pourrait ne pas être un problème, mais il peut encore être dans votre chemin si vous essayez de comprendre pourquoi quelque chose ne fonctionne pas.

Je n'ai pas testé, mais les éléments suivants doivent être OK dans votre méthode Dispose:

if (_Host.State == CommunicationState.Faulted) 
{ 
    _Host.Abort(); 
} 
else 
{ 
    _Host.Close(); 
} 
+0

Oui, j'ai entendu parler de cette question. Donc, cela s'applique à ce cas, je vois. – mafu

+0

oui, je devais découvrir à la dure que ce problème ne s'applique pas seulement aux clients mais aussi aux hôtes ... –

0

Cela me semble bien si vous êtes OK avec les limitations d'une liaison fixe et l'adresse du serveur.

Vous devez être sûr que le code dans la using dure aussi longtemps que vous voulez que l'hôte soit disponible.

0

Si je mettre en œuvre que l'hôte de soi, je le mettrais dans un service Windows, en utilisant les événements OnStart et OnStop . En outre, effectuez les modifications suivantes pour les meilleures pratiques:

  • Placez la configuration de point de terminaison dans un fichier App.Config - mieux à gérer dans un environnement de production.
  • Séparer le Service d'accueil des binaires de mise en œuvre et contrat.

Vous pouvez également consulter le site MSDN: http://msdn.microsoft.com/en-us/library/ms730158%28v=VS.90%29.aspx Il y a une bonne façon de « héberger le service dans un service Windows »

+0

Je crois que mettre l'hôte pour _testing_ dans un Windows Service est au moins excessif ou peu pratique. – mafu

+0

Je ne pense pas. Si vous effectuez une recherche dans MSDN, les meilleures pratiques pour implémenter Self Host sont l'installation à l'aide des services Windows. Quoi qu'il en soit, il est préférable de déployer en utilisant le type d'hébergement que vous avez testé auparavant. – Erup

+0

@Erup: Les meilleures pratiques pour inproc hébergement sur MSDN sont pour un service WCF dans la production. Pour tester, l'hébergement d'inproc dans la solution de test est beaucoup plus logique. –

Questions connexes