Pourquoi ne pas mon ChannelFactory voir mon point de terminaison de configuration?
J'ai suivi Miguel Castro excellent article sur la WCF ici et ça fonctionne bien, sauf que j'ai le code suivant
public AdminClient()
{
ChannelFactory<IProductAdmin> factory = new ChannelFactory<IProductAdmin>();
productAdminChannel = factory.CreateChannel();
}
Dans mon application.fichier de config, j'ai la configuration suivante:
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8002/ProductBrowser"
binding="netTcpBinding"
contract="Contracts.IProductAdmin" />
</client>
</system.serviceModel>
Mais, lorsque je lance le constructeur de AdminClient j'obtiens une exception en disant que le point de terminaison n'est pas défini. Cependant, si je change de configuration de donner le point de terminaison d'un nom, puis de créer l'usine comme suit, il fonctionne.
public AdminClient()
{
var fac = new ChannelFactory<IProductAdmin>("admin");
productAdminChannel = fac.CreateChannel();
}
<system.serviceModel>
<client>
<endpoint name="admin"
address="net.tcp://localhost:8002/ProductBrowser"
binding="netTcpBinding"
contract="Contracts.IProductAdmin" />
</client>
</system.serviceModel>
J'aimerais une explication pour cela. La documentation MSDN n'est pas beaucoup d'aide...
- Vous pouvez le faire à l'extérieur avec votre .fichier de configuration entièrement en passant par la liaison et l'adresse de la ChannelFactory.
- Je pense que le point est le divorce le client à partir de détails de mise en œuvre. Manuellement de faire le travail de la configuration du système est douloureux et inutiles. Si le client est d'avoir un point de terminaison pour une interface donnée ensuite à l'aide d'un astérisque trouverez la première qualification de point de terminaison, ce qui permettra de satisfaire à l'exigence de plus simple client.
- Sky Hi. Désolé, n'avez pas fait attention, et c'était il y a si longtemps pour moi, je ne me souviens pas ce que j'ai besoin 🙂 Mais merci pour votre travail!
Vous devez vous connecter pour publier un commentaire.
Utiliser "*" utilisation de la première qualification, point de terminaison.
MSDN Exemple
A wildcard endpoint configuration name "*" is available and indicates to the ApplyConfiguration method that it should load any endpoint configuration in the file, provided there is precisely one available, and otherwise throws an exception.
Vous devez spécifier le nom du point de terminaison, parce que vous pouvez avoir de nombreux points de terminaison pour le même type de contrat. (Par exemple un service en cours de déploiement sur un tcp et un http ws point de terminaison). Microsoft aurait bien sûr construit quelque chose dans WCF pour vérifier si il y a un seul client pour le contrat d'interface, mais cela n'aurait pas été très cohérent. (que cela pourrait fonctionner si il n'y a qu'un seul critère spécifié par le contrat). Lorsque vous ajoutez un autre point de terminaison pour le même contrat plus tard, le code de casser dans ce cas.
Vous pouvez vous en sortir sans spécifier de nom de point de terminaison sur le côté service.
Pour le côté client, vous devez spécifier le nom, parce que vous pouvez connecter à plusieurs services qui ont le même contrat. Comment WCF savoir ensuite qui vous voulez?
Cette a été mise sur écoute-moi pour quelques jours, donc je suis allé à travers les exemples présentés dans l'article lié ci-dessus. Tout fonctionne correctement sauf pour le deuxième client de proxy exemple que vous rencontrez un problème avec. Comme vous l'avez remarqué, et l'autre answerers création d'un proxy dans cette voie nécessite un nom de point de terminaison, en le couplant avec le client (qui est l'endroit où le point de terminaison est défini). Je ne suis toujours pas sûr pourquoi elle se comporte de cette façon, mais je n'ai trouvé aucun moyen pour utiliser cet exemple, sans explicitement le couplage du proxy pour le point de terminaison.
D'autre part, le premier exemple qui montre comment créer le proxy exige pas explicitement le couplage de l'adresse de point de terminaison ou de liaison:
Qui semble très bien fonctionner. Donc, peut-être la deuxième proxy exemple est juste une mauvaise façon de faire les choses, ou peut-être nous manque quelque chose d'évident...
Si vous ne voulez pas spécifier de Nom de point de terminaison explicitement, vous pouvez écrire:
Constructeur sans paramètre inutile ne fonctionne pas.