WCF, ChannelFactory, “Не могли найти элемент конечной точки …”

Я пытаюсь назвать сервис WCF из другого сервиса в части с помощью примера, который я нашел здесь на StackOverflow, который реализует ChannelFactory.

Я создал отдельный консольный проект приложения в своем решении для тестирования (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 e)
            {
                // exception code hereMySolution
            }
        }
    }
}

Это из Приложения локальной службы. Конфигурация, показывающая конечную точку:


  
   
  
  ...
   

Это из собственного Приложения тестового проекта. Конфигурация:

 
      
   

Это - метод, который я выставил в своей локальной службе, которая в свою очередь передает объект запроса удаленной службе:

public ServiceContract.Response.ZZZ_Response SubmitRemoteServiceRequest(ServiceContract.Request.ZZZ_Request sc_TheirServiceRequest)
{
     var factory = new ChannelFactory("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;
}

Ошибка, которую я получаю, является этим:

Не удалось найти элемент конечной точки с именем 'ServiceSoap' и сократить 'ServiceReference. ServiceSoap' в клиентском разделе конфигурации ServiceModel. Это могло бы быть то, потому что никакой конфигурационный файл не был найден для Вашего приложения, или потому что никакой элемент конечной точки, соответствующий этому имени, не мог быть найден в клиентском элементе.


Я смущен, где точно я пропускаю элемент конечной точки в app.config для локальной службы (который Сервисная Ссылка определила, который указывает на удаленный сервис), app.config для тестового приложения, или в другом месте?!


ОБНОВЛЕНИЕ: Я нашел своего рода обходное решение после чтения этой статьи MSDN, или я предполагаю просто другой способ инстанцировать ChannelFactory:

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

Вместо того, чтобы пытаться захватить от несуществующей или неправильной информации в моем app.config, я вместо этого вручную включаю значения для Привязки (BasicHttpBinding) и адрес к удаленному сервису. Это, кажется, заканчивает меня, "Не удалось найти ошибку" элемента конечной точки, но я не уверен, является ли это лучшим решением.

10
задан Darth Continent 30 August 2011 в 14:41
поделиться

1 ответ

Ну, в коде вашего тестового приложения вы запрашиваете элемент конечной точки по имени "ServiceSoap":

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

но в вашем конфиге такой конечной точки нет:

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

Конфигурация содержит элемент конечной точки по имени "BasicHttpBinding_IServiceContract" (определяемый атрибутом name= на вашем узле). Таким образом, либо вы изменяете строку в вашем тестовом приложении, чтобы запросить этот элемент конечной точки:

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

или вы изменяете ваш app.config для тестового приложения на использование ServiceSoap в качестве имени:

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

Любое из двух элементов должно решить вашу проблему.

В вашем "нормальном" клиентском приложении это работает, потому что когда вы создаете клиентский прокси, вы вообще не указываете имя элемента конечной точки - WCF будет использовать только один и единственный элемент, который присутствует в данный момент. Если у вас должно быть более одного элемента конечной точки (например, при использовании разных протоколов), то этот вызов без указания, какой элемент конечной точки использовать, приведет к возникновению исключения, и вы должны будете изменить его, чтобы указать, какой элемент конечной точки (по его имени) тоже использовать.

.
16
ответ дан 3 December 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: