WCF, ChannelFactory“, ne Pouvait pas trouver d'extrémité de l'élément...”

Je suis en train d'appeler un service WCF dans un autre service, en partie, à l'aide d'un exemple que j'ai trouvé ici sur StackOverflow qui implémente ChannelFactory.

J'ai créé une application console projet au sein de ma solution pour le test (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
            }
        }
    }
}

C'est à partir du service local du App.Config montrant le point de terminaison:

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

C'est à partir du 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>  

C'est la méthode que j'ai exposée dans mon local de service, qui transmet à son tour un objet de demande pour le service à distance:

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 ceci:

Ne pouvait pas trouver d'extrémité de l'élément avec le nom " ServiceSoap' et contrat " ServiceReference.ServiceSoap " dans le ServiceModel section de configuration de client. Ce pourrait être parce que le fichier de configuration n'a été trouvé pour votre application, ou parce qu'aucun d'extrémité de l'élément correspondant à ce nom peut être trouvé dans le client de l'élément.


Je suis confus, où, exactement, ai-je raté l'extrémité de l'élément, dans l'application.config pour le service local (qui dispose d'un Service de Référence défini qui pointe vers le service à distance), l'app.config pour l'application de test, ou d'ailleurs?!


Mise à JOUR: j'ai trouvé une solution de contournement de sortes après la lecture de cet article MSDN, ou je suppose que juste une façon différente de l'instanciation de la ChannelFactory:

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

Au lieu d'essayer de s'emparer de inexistant ou d'informations incorrectes dans mon application.config, je suis plutôt manuelle de brancher les valeurs de la Liaison (BasicHttpBinding), et l'adresse de la télécommande de service. Cela semble me passé le "impossible de trouver le point de terminaison de l'élément" erreur, mais je ne suis pas sûr si c'est la meilleure solution.

OriginalL'auteur Darth Continent | 2009-12-29