Не удалось найти элемент конечной точки по умолчанию
Я добавил прокси-сервер в веб-сервис для решения 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 ответов:
" эта ошибка может возникнуть, если вы вызываете службу в библиотеке классов и вызываете библиотеку классов из другого проекта."
в этом случае вам нужно будет включить параметры конфигурации 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>