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


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

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

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

<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) Приложение.конфигурация копируется в приложение.исполняемый.config, так что это тоже не проблема.

какие-то зацепки?

30 333

30 ответов:

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

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

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

contract= "IMySOAPWebService"

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

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

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();
} 

Edit

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

у меня была такая же проблема. Оказывается, что для веб-ссылки вы должны предоставить 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>

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

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

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

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

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

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

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

" в этом случае вам нужно будет включить параметры конфигурации WS в приложение main projects.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 ...
            }

смотрите подробности в в этой статье.

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

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

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

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

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

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

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

MyServiceClient myService = new MyServiceClient();

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

Я нашел (а также копирование в приложение пользовательского интерфейса клиента.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" />

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

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

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

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

вы в основном хотите все внутри :

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

модульное тестирование небиблиотечных приложение, которое потребляет услуги могут вызвать эту проблему.

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

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

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

Я столкнулся с этой проблемой один раз. Это было потому, что я все еще разрабатывал интерфейс, который использует службу WCF. Я настроил тестовое приложение и продолжил разработку. Затем в процессе разработки я изменил некоторые пространства имен служб. Поэтому я дважды проверил " систему.ПТД -> клиент -> точка -> контракт" в интернете.конфигурация для соответствия классу WCF. Тогда проблема решена.

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

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

У меня такая же проблема.Я использую службу WCF в библиотеке классов и вызываю библиотеку классов из проекта приложения windows.но я забыл изменить <system.serviceModel> в конфигурационном файле проекта приложения windows то же самое <system.serviceModel> приложения библиотеки классов.Конфигурационный файл.
решение: измените конфигурацию внешнего проекта так же, как конфигурацию wcf библиотеки классов.

Если вы ссылаетесь на веб-службу в библиотеке классов, то вам нужно скопировать приложение.конфигурация для вашего приложения windows или консольного приложения

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

работал на меня

Привет я столкнулся с той же проблемой, но лучшее решение-позволить .NET настроить конфигурацию на стороне клиента. То, что я обнаруживаю, это когда я добавляю ссылку на службу со строкой запроса http:/namespace/service.СВК?wsdl=wsdl0 он не создает конечные точки конфигурации на стороне клиента. Но когда я удалю его ?язык WSDL-wsdl0 и использовать только http:/namespace/service URL-адрес.svc, он создает конфигурацию конечной точки в файле конфигурации клиента. для краткости снять " ?WSDL=WSDL0" .

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

в случае, если вы используете приложение WPF с использованием PRISM framework, конфигурация должна существовать в вашем стартовом проекте (т. е. в проекте, где находится ваш загрузчик.)

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

существует несколько способов создания / устранения этой проблемы. Для меня продукт CRM, который я использую, был написан в машинном коде и может вызывать мою dll .NET, но я запускаю информацию о конфигурации, которая должна быть в/над основным приложением. Для меня, приложения CRM нет .Чистая, так что я в конечном итоге того, чтобы положить его в моей машине.конфигурационный файл (не там, где я хочу). Кроме того, поскольку моя компания использует Websense, мне было трудно даже добавить ссылку на службу из-за прокси 407 Аутентификация требуется проблема, что требуется модификация машины.Конг.

Прокси-решение:

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

ОК. Мой случай был немного другим, но, наконец, я нашел решение для него: У меня есть консоль.В EXE -> DLL-файл -> вызова с ws1 -> DLL-файл -> вызов рабочий поток 2

У меня были как конфигурации сервисной модели WS1, так и WS2 в консоли.ИСПОЛНЯЕМЫЙ.конфигурация, как рекомендуется. - это не решило проблему.

но это все равно не сработало, пока я не добавил Вебссылку в рабочий поток 2, чтобы с ws1 также и не только для DLL, которая фактически создает и вызывает прокси-сервер WS2.

У меня была такая же проблема
Я использовал настольное приложение и использовал глобальный веб-сервис погоды

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

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

ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");

только взял весь день, чтобы работать. Кроме того, имя контракта было неправильным, как только это исправление было на месте, хотя оно было неправильным, когда появилась первоначальная ошибка. Дважды, а затем трижды проверьте строки имени контракта люди !! свойства: ян

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

мой 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>

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

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

т. е.

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

работает, а

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

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

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

я получил ту же ошибку, и я попробовал некоторые многие вещи, но не работал, чем я заметил, что мой "контракт" не был таким же для целых проектов, я изменил контракт, как и для всех проектов внутри решения, и чем он работал. Это проект а

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

при добавлении ссылки на службу

enter image description here

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

enter image description here

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

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