wcf - service binding configuration type




Не удалось найти элемент конечной точки по умолчанию (20)

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

«В этом случае вам нужно будет включить настройки конфигурации 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 ...
            }

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

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

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

Поиск этой ошибки говорит мне использовать полное пространство имен в контракте. Вот мой 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 local (я упоминаю об этом, потому что ряд хитов Google упоминает win2k3). Файл app.config копируется в app.exe.config, так что это тоже не проблема.

Любые подсказки?


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

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


Если вы ссылаетесь на веб-службу в своей библиотеке классов, вам необходимо скопировать app.config в приложение Windows или консольное приложение

Решение: измените конфигурацию внешнего проекта так же, как и конфигурацию wcf библиотеки классов.

Работал для меня


Испытав несколько вариантов, я, наконец, решил это, используя

Контракт «IMySOAPWebService»

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


Когда вы добавляете ссылку на службу

остерегайтесь пространства имен, которое вы вводите:

Вы должны добавить его к имени вашего интерфейса:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>

Не ставьте строку объявления клиента службы как поле класса, а не создавайте экземпляр для каждого используемого метода. Поэтому проблема будет устранена. Если вы создаете экземпляр клиента службы как поле класса, тогда возникает ошибка времени разработки!


Однажды я столкнулся с этой проблемой. Это было потому, что я все еще разрабатывал интерфейс, который использует службу WCF. Я настроил тестовое приложение и продолжил разработку. Затем в процессе разработки я изменил некоторые пространства имен служб. Поэтому я дважды проверял «system.serviceModel -> client -> endpoint -> contract» в web.config для соответствия классу WCF. Тогда проблема решена.


Позвольте мне добавить еще одну вещь, которую нужно искать. (Ответ Тома Хейга уже намекает на это, но я хочу быть явным)

Мой файл web.config имеет следующие значения:

<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

Я уже использовал basicHttpsBinding для одной ссылки, но затем добавил новую ссылку, требующую basicHttpBinding (no s). Все, что мне нужно было сделать, это добавить к моему protocolMapping следующее:

<protocolMapping>
    <add binding="basicHttpBinding" scheme="http" />
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

Как правильно указывает L.R. , это необходимо определить в нужных местах. Для меня это означало один в app.config проекта Unit Test, а также один в web.config основного проекта службы.


Просто для кого-то другого с той же проблемой; Я написал модульный тест для моего метода, который пытался подключиться к моей службе. С этим единственным исключением это случалось каждый раз - я понятия не имею, почему. Когда я запускал его из winform, он отлично работает.


Пространство имен в вашем конфиге должно отражать остальную часть пути пространства имен после пространства имен по умолчанию вашего клиента (как указано в свойствах проекта). Основываясь на вашем ответе, я предполагаю, что ваш клиент настроен на использование в пространстве имен Fusion.DataExchange.Workflows. Если вы переместили код клиента в другое пространство имен, вам нужно будет обновить конфигурацию, чтобы соответствовать оставшемуся пути пространства имен.


У меня была та же проблема, но изменение пространства имен контрактов не сработало для меня. Поэтому я попробовал веб-ссылку типа .Net 2 вместо справочной ссылки .Net 3.5. Это сработало.

Чтобы использовать веб-ссылку в Visual Studio 2008, нажмите «Добавить ссылку на службу», затем нажмите «Дополнительно», когда появится диалоговое окно. В этом случае вы найдете вариант, который позволит вам использовать веб-ссылку вместо ссылки на службу.


У меня была такая же проблема
Я использовал настольное приложение и использовал веб-службу Global Weather Web

Я удалил ссылку на службу и добавил веб-ссылку и проблему решена Спасибо


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

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

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

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

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


У меня была эта ошибка, когда я ссылался на Контракт в элементе файла конфигурации без оператора глобальной области видимости.

т.е.

<endpoint contract="global::MyNamepsace.IMyContract" .../>

работает, но

<endpoint contract="MyNamepsace.IMyContract" .../>

дает сообщение «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт».

Сборка, содержащая MyNamepsace.IMyContract, находится в другой сборке для основного приложения, поэтому это может объяснить необходимость использования разрешения глобальной области.


У меня есть ситуация, которая в тесте Unit. Я скопировал файл app.config в проект модульного тестирования. Таким образом, проект тестирования модулей также содержит информацию о конечных точках.


У меня такая же ошибка, и я пробовал кое-что, но не работал, чем заметил, что мой «контракт» был не таким же для целых проектов, я изменил контракт, как это было бы для всех проектов внутри решения, и чем это сработало. Это проект A

<client>
    <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
</client>

Проект B:

<client>
    <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
</client>

Наконец, я изменил для обоих:

<client>
    <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>

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


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

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

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

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

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

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

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

MyServiceClient myService = new MyServiceClient();

Я обнаружил (а также копирование в App.config клиентского интерфейса UI, когда я использовал интерфейс библиотеки классов). Мне пришлось префикс имени привязки с именем Service Reference ( ServiceReference is 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" />

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





endpoint