49 votes

Pourquoi mon ChannelFactory ne voit-il pas la configuration de mon ordinateur d'extrémité?

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...

62voto

Sky Sanders Points 19557

Utilisez "*" pour utiliser le premier noeud final éligible.

 public AdminClient()
{
    ChannelFactory<IProductAdmin> factory  
         = new ChannelFactory<IProductAdmin>("*");

    productAdminChannel = factory.CreateChannel();
}
 

3voto

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.

2voto

Tad Donaghe Points 5331

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:

 using System;
   using System.ServiceModel;

   namespace CoDeMagazine.ServiceArticle
   {
       public class ProductClient 
          : ClientBase<IProductBrowser>, 
            IProductBrowser
       {

           #region IProductBrowser Members

           public ProductData GetProduct(
              Guid productID)
           {
               return Channel.GetProduct(productID);
           }

           public ProductData[] GetAllProducts()
           {
               return Channel.GetAllProducts();
           }

           public ProductData[] FindProducts(
              string productNameWildcard)
           {
               return Channel.FindProducts(
                  productNameWildcard);
           }

           #endregion
       }

   }

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...

2voto

Krzysztof Kozmic Points 19262

Vous pouvez vous en sortir sans spécifier le nom du noeud final côté service. Pour le côté client, vous devez spécifier le nom, car vous pouvez vous connecter à plusieurs services ayant le même contrat. Comment la WCF saurait-elle alors laquelle vous voulez?

1voto

Si vous ne souhaitez pas spécifier explicitement le nom du noeud final, vous pouvez écrire:

     public AdminClient()
    {
        ChannelFactory<IProductAdmin> factory =  
           new ChannelFactory<IProductAdmin>(string.Empty);
        productAdminChannel = factory.CreateChannel();
    }
 

Le constructeur sans paramètre inutile ne fonctionne pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X