J'ai un petit moteur d'hébergement WCF que j'écris qui va créer dynamiquement des ServiceHosts basés sur le fichier .config. L'idée générale est de nous permettre de supprimer des services existants, ainsi que d'ajouter de nouveaux services, à l'exécution sans avoir à mettre tous nos services hors ligne.Conflit de ServiceHost sur l'adresse lors du test de l'unité
J'ai rencontré un problème de test d'unité qui indique que cela peut ne pas être aussi facile que cela puisse paraître. Il semble qu'un seul ServiceHost puisse exister pour n'importe quel point de terminaison donné (même si plusieurs points de terminaison différents pour un service peuvent exister dans un seul ServiceHost). Ce n'est pas un problème normalement, cependant quand un service doit être reconfiguré, l'abaissement du ServiceHost d'origine ne tue pas réellement l'enregistrement pour cette adresse de point de terminaison. Essayer de créer un autre ServiceHost, pour le même service (ce qui signifie que les mêmes critères d'évaluation sont utilisés) échoue à l'exception suivante:
System.InvalidOperationException: The ChannelDispatcher at 'net.pipe://localhost/' with contract(s) '"ITestService"' is unable to open its IChannelListener. --->
System.InvalidOperationException: A registration already exists for URI 'net.pipe://localhost/'.
Je rencontre en fait l'erreur lors de tests unitaires. Les tests exerceront une unité, ce qui ferme complètement le ServiceHosts et héberge le moteur autant qu'il est humainement possible. Puis crée une autre instance du moteur d'hébergement, qui essaie de recréer les mêmes ServiceHosts pour un test différent. Le deuxième test rencontre l'erreur ci-dessus. Je devine que pendant que ServiceHost.Close() a été appelé, cela ne détruit pas réellement l'hôte de service ... ainsi il traîne toujours dans la mémoire. Je ne peux pas dire si le GC nettoie les anciens serveurs ou pas ... le problème persiste sans partir après qu'il se soit produit initialement (du mieux que j'ai pu le déterminer ... J'ai attendu environ 30 minutes jusqu'à présent.)
Mon fichier de configuration pour system.serviceModel est la suivante:
<system.serviceModel>
<services>
<service name="Campus.Core.ServiceModel.TestServiceStub">
<endpoint
address="net.pipe://localhost"
binding="netNamedPipeBinding"
contract="Campus.Core.ServiceModel.ITestService"
/>
</service>
</services>
</system.serviceModel>
Je suis confronté au même problème. Avez-vous été capable de le résoudre depuis? – Elan
Je suis tombé sur ce problème il y a un an ou deux. Je n'ai plus le code, mais j'ai trouvé un moyen d'héberger le service par programmation via le code, ce qui m'a permis de changer le port lors des tests unitaires. J'espère que cela vous aidera de quelque façon que ce soit. –