Не удалось найти элемент конечной точки с именем и контрактом

Я добавил ссылку на службу WCF, которая имеет две конечные точки. При добавлении сервиса в файл конфигурации добавляется следующее:

<client>
  <endpoint name="ABCServiceV1" address="http://staging.ABCwebservices.com/ABC/Service.svc"
    binding="basicHttpBinding" bindingConfiguration="ABCServiceV1"
    contract="ABCService.IService"  />
  <endpoint name="ABCServiceV2" address="http://staging.ABCwebservices.com/ABC/Service.svc/20"
    binding="basicHttpBinding" bindingConfiguration="ABCServiceV2"
    contract="ABCService.IService1"  />
</client>

Код для создания клиента, как показано ниже:

ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV2");

Тем не менее я получаю сообщение об ошибке во время выполнения: "Не удалось найти элемент конечной точки с именем" ABCServiceV2 "и контрактом" ABCService.IService "в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за отсутствия элемент конечной точки, соответствующий этому имени, может быть найден в элементе client. "

если бы я использовал ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV1"); тогда все работает нормально. Но при использовании ABCServiceV2 он пытается найти контракт - ABCService.IService - когда он должен искать - ABCService.IService1.

Как мне заставить его искать правильный контракт?

2 ответа

Решение

Если вы добавили вторую ссылку на другой сервис (ABCServiceV2), то я считаю, что это создаст второй класс сервиса для ABCServiceV2. Два класса будут реализовывать отдельные контракты (ABCService.IService и ABCService.IService1), поэтому вы не сможете обменять конечные точки.

Я считаю, что вы должны иметь возможность инициализировать две конечные точки службы следующим образом:

ABCService.ServiceClient ABCClient = new ServiceClient("ABCServiceV1");
ABCService.Service1Client ABCClient1 = new Service1Client("ABCServiceV2");

Несмотря на то, что этот пост старый и на него ответили, ответ не помог в моем случае. Моя проблема заключалась в том, что я сгенерировал служебный клиент с помощью инструмента svcutil.exe, но вообще не указал никакого пространства имен; и поэтому имя пространства имен контракта было сгенерировано как целевое пространство имен документа схемы по умолчанию, да, общий беспорядок.

С другой стороны, я пытался использовать файл конфигурации, сгенерированный при добавлении сервисной ссылки в проект. Пространство имен контракта в этом файле - ServiceReference1 (по умолчанию) или любое другое имя, которое вы хотите, идеальный шторм! Но все, что мне нужно было сделать, это удалить часть пространства имен из FQN из <endpoint> атрибут контракта, и контракт стал видимым для CLR.

Надеюсь, что это поможет другим

Другие вопросы по тегам