Question

Je suis en train d'appeler un service WCF à partir d'un autre service, en partie par un exemple que je trouve ici sur StackOverflow qui implémente ChannelFactory .

J'ai créé un projet d'application de console séparée dans ma solution pour les tests (VS 2008, BTW),

namespace MyService.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            MySolution.MyTestClient proxy = new MyTestClient();

            proxy = new MyTestClient();
            proxy.Endpoint.Address = new EndpointAddress("http://localhost:8723/MySolution/");

            // Instantiate a request object and assign values to its member variables.    
            MySolution.RemoteServiceMethod() theObject = new RemoteServiceMethod();            
            theObject.SomeProperty = "123";
            theObject.SomeOtherProperty = "alpha";

            Console.WriteLine("Calling the remote service method now...");

            try
            {
                proxy.SubmitRemoteServiceRequest(proxy.theObject);
            }
            catch (FaultException<MySolution.RequestException> e)
            {
                // exception code hereMySolution
            }
        }
    }
}

est de son service local App.Config montrant le point final:

<system.serviceModel>
  <client>
   <endpoint address="http://MyService/MyService.asmx"
     binding="basicHttpBinding" bindingConfiguration="ServiceSoap"
     contract="ServiceReference.ServiceSoap"
     name="ServiceSoap" />
  </client>
  ...
 </system.serviceModel>  

est de ce projet de test propre App.Config :

 <client>
      <endpoint address="http://localhost:8723/MyService"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServiceContract"
        contract="ServiceContract.IServiceContract" name="BasicHttpBinding_IServiceContract" />
 </client>  

Ceci est la méthode que je l'ai exposé dans mon service local, qui passe à son tour un objet de requête au service distant:

public ServiceContract.Response.ZZZ_Response SubmitRemoteServiceRequest(ServiceContract.Request.ZZZ_Request sc_TheirServiceRequest)
{
     var factory = new ChannelFactory<ServiceReference.ServiceSoap>("ServiceSoap");
     var wcfClient = factory.CreateChannel();
     bool closedSuccessfully = false;

     // Instantiate a response object which I will return to the consumer.
     ServiceContract.Response.ZZZ_Response zzz_Response = new ServiceContract.Response.ZZZ_Response();

     // Instantiate request and response objects, respectively, which I use internal to my service to call remote service.
     ServiceReference.MyServiceRequest scMyServiceRequest = new ServiceReference.MyServiceRequest();

     ServiceReference.MyServiceResponse scMyServiceResponse = new ServiceReference.MyServiceResponse();

     try
     {                
          // Now you can make calls on the wcfClient object
          scMyServiceResponse = wcfClient.MyServiceMethod(scMyServiceRequest );                

          ((ICommunicationObject)wcfClient).Close();
          closedSuccessfully = true;
     }
     finally
     {
          if (!closedSuccessfully)
          {
               ((ICommunicationObject)wcfClient).Abort();
          }
     }

     return zzz_Response;
}

L'erreur que je reçois est la suivante:

Impossible de trouver l'élément point final avec le nom ' ServiceSoap et le contrat' ServiceReference.ServiceSoap dans la section de configuration du client ServiceModel. Cela peut être parce qu'aucun fichier de configuration n'a été trouvée pour votre application, ou parce qu'aucun élément de point final correspondant à ce nom n'a pu être trouvée dans l'élément client.


Je suis confus, où exactement ce que je manque l'élément de point final, dans le app.config pour le service local (qui a un service de référence défini que les points au service à distance), le app.config pour l'application de test, ou ailleurs?


UPDATE : J'ai trouvé une solution de contournement de toutes sortes après avoir lu cet article MSDN , ou je suppose juste une façon différente de l'instanciation ChannelFactory:

var factory = new ChannelFactory<ServiceReference.ServiceSoap>(new BasicHttpBinding(), "http://urlToRemoteService/RemoteService.asmx");

Au lieu d'essayer de saisir d'informations inexistantes ou incorrectes dans mon app.config, je suis à la place de brancher manuellement les valeurs pour la liaison (BasicHttpBinding) et l'adresse au service à distance. Cela me semble aller au-delà de l'erreur « Impossible de trouver l'élément point final », mais je ne suis pas sûr que ce soit la meilleure solution.

Était-ce utile?

La solution

Eh bien, dans le code de votre application de test, vous demandez l'élément de point limite par le nom de « ServiceSoap »:

 var factory = new ChannelFactory<ServiceReference.ServiceSoap>("ServiceSoap");

mais dans votre config, il n'y a pas de point final:

 <client>
      <endpoint address="http://localhost:8723/DelinquencyService"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServiceContract"
        contract="ServiceContract.IServiceContract" name="BasicHttpBinding_IServiceContract" />
 </client>  

La configuration contient un élément de point d'extrémité sous le nom de « BasicHttpBinding_IServiceContract » (définie par l'attribut name= sur le noeud de <endpoint>).

Donc, soit vous changez la ligne dans votre application de test pour demander cet élément de point final:

 var factory = new ChannelFactory<ServiceReference.ServiceSoap>("BasicHttpBinding_IServiceContract");

ou vous changez votre app.config pour l'application de test à utiliser ServiceSoap comme nom:

<client>
   <endpoint name="ServiceSoap"
        address="http://localhost:8723/DelinquencyService"
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_IServiceContract"
        contract="ServiceContract.IServiceContract" />
</client>  

Soit des deux devrait résoudre votre problème.

Dans votre application client « normal », cela fonctionne parce que quand vous créez le proxy client, vous ne spécifiez pas un nom d'élément de point de terminaison du tout - WCF il suffit d'utiliser l'un et seul élément qui est présent. Si vous devriez avoir plus d'un élément de point final (par exemple en utilisant différents protocoles), cet appel sans spécifier quel élément de point final à utiliser jetterait une exception, et que vous devez changer pour spécifier quel élément point final (par son nom) à utiliser , aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top