Не удалось найти элемент конечной точки по умолчанию - PullRequest
348 голосов
/ 09 декабря 2008

Я добавил прокси в веб-сервис для решения VS2008 / .NET 3.5. При построении клиента .NET выдает эту ошибку:

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

Поиск этой ошибки говорит мне использовать полное пространство имен в контракте. Вот мой app.config с полным пространством имен:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

Я использую локальную XP (я упоминаю об этом, потому что в ряде хитов Google упоминается win2k3) App.config копируется в app.exe.config, так что это тоже не проблема.

Есть какие-нибудь подсказки?

Ответы [ 32 ]

565 голосов
/ 29 апреля 2010

"Эта ошибка может возникнуть, если вы вызываете службу в библиотеке классов и вызываете библиотеку классов из другого проекта."

В этом случае вам нужно будет включить параметры конфигурации WS в основной проект app.config, если это winapp или web.config, если это веб-приложение. Это способ работать даже с PRISM и WPF / Silverlight.

76 голосов
/ 16 июня 2011

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

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

Редактировать

Если вы используете https, вам нужно использовать BasicHttpsBinding вместо BasicHttpBinding.

73 голосов
/ 10 декабря 2008

Протестировав несколько вариантов, я наконец решил это с помощью

Контракт "IMySOAPWebService"

т.е. без полного пространства имен в конфиге. По какой-то причине полное имя не удалось решить правильно

54 голосов
/ 10 июня 2010

У меня была такая же проблема. Оказывается, для веб-ссылки вы должны указать URL-адрес в качестве первого параметра для конструктора:

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

Для веб-справки нового стиля вы должны указать имя, которое относится к записи конечной точки в конфигурации:

new WebService.WebServiceSoapClient("WebServiceEndpoint");

С соответствующей записью в Web.config или App.config:

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

Довольно чертовски сложно удалить туннельное видение "это работало в более старой программе" ...

16 голосов
/ 11 августа 2011

У меня была такая ситуация, когда у меня была

  • Служба WCF, размещенная где-то
  • Основной проект
  • Потребительский проект типа «библиотека классов», в котором имеется ссылка на службу для службы WCF
  • Основной проект вызывает методы из потребительского проекта

Теперь проект Consumer имел все связанные настройки в теге <system.serviceModel> моего app.config, он по-прежнему выдавал ту же ошибку, что и выше.

Все, что я сделал, это добавил один и тот же тег <system.serviceModel> в файл app.config моего основного проекта, и, наконец, нам пора.

Реальная проблема, поскольку в моем случае это было чтение неверного файла конфигурации. Вместо app.config потребителя он ссылался на конфигурацию основного проекта. Мне понадобилось два часа, чтобы понять это.

13 голосов
/ 05 декабря 2014

"Эта ошибка может возникнуть, если вы вызываете службу в библиотеке классов и вызываете библиотеку классов из другого проекта."

"В этом случае вам нужно будет включить параметры конфигурации WS в основной проект app.config, если это winapp или web.config, если это веб-приложение. Это способ работать даже с PRISM и WPF / Silverlight . "

Да, но если вы не можете изменить основной проект (например, Orchard CMS), вы можете сохранить конфигурацию службы WCF в своем проекте.

Вам необходимо создать сервисный помощник с методом генерации клиента:

public static class ServiceClientHelper
{
    public static T GetClient<T>(string moduleName) where T : IClientChannel
    {
        var channelType = typeof(T);
        var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace);
        var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute;

        if (contractAttribute == null)
            throw new Exception("contractAttribute not configured");

        //path to your lib app.config (mark as "Copy Always" in properties)
        var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName)); 

        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None);
        var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);

        if (serviceModelSectionGroup == null)
            throw new Exception("serviceModelSectionGroup not configured");

        var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
        var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

и используйте его:

using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
                ... get data from service ...
            }

Подробнее см. В этой статье .

12 голосов
/ 15 октября 2009

Этот сводил меня с ума.

Я использую Silverlight 3 Prism (CAB) с WCF

Когда я вызываю службу WCF в модуле Prism, я получаю ту же ошибку:

Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт «IMyService» в разделе конфигурации клиента модели сервиса. это может быть потому, что для вашего приложения не найден файл конфигурации или потому что элемент конечной точки, соответствующий этому контракту, не может быть найден в клиентском элементе

Оказывается, что он ищет в файле .xap оболочки файл ServiceReferences.ClientConfig, а не в файле ServiceReferences.ClientConfig модуля. Я добавил свою конечную точку и привязку к существующему файлу ServiceReferences.ClientConfig в моем приложении Silverlight Shell (оно вызывает собственные службы WCF).

Затем мне пришлось перестроить приложение Shell, чтобы сгенерировать новый файл .xap для папки ClientBin моего веб-проекта.

Теперь эта строка кода наконец работает:

MyServiceClient myService = new MyServiceClient();
12 голосов
/ 05 июля 2017

Несколько ответов здесь указывают на правильное решение, когда вы сталкиваетесь с ошеломляющей ошибкой обращения к службе из файла класса: скопируйте информацию о конфигурации службы в ваш app.config web.config консоли или приложения Windows. Похоже, что ни один из этих ответов не показывает вам, что копировать. Давайте попробуем исправить это.

Вот что я скопировал из файла конфигурации моей библиотеки классов, в файл конфигурации моего консольного приложения, чтобы обойти эту безумную ошибку для службы, которую я пишу, называемой "TranslationServiceOutbound".

В принципе, вам нужно все внутри system.serviceModel :

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
    contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
</client>

11 голосов
/ 29 августа 2014

Я получал эту ошибку в приложении ASP.NET, где служба WCF была добавлена ​​в библиотеку классов, которая добавляется в приложение ASP.NET в виде ссылочного DLL-файла в папке bin. Для устранения ошибки необходимо скопировать параметры конфигурации в файле app.config в библиотеке классов, ссылающейся на службу WCF, в настройки web.config для сайта / приложения ASP.NET.

9 голосов
/ 30 октября 2010

Я обнаружил (как и при копировании в App.config пользовательского интерфейса, так как я использовал интерфейс библиотеки классов), мне пришлось ставить префикс имени привязки с именем ссылки на сервис (мой номер ServiceReference в ниже).

например:.

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ServiceReference.ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

вместо сгенерированного по умолчанию:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />
...