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


98

Любые идеи, как это исправить?

UserService.UserServiceClient userServiceClient = new UserServiceClient();
            userServiceClient.GetUsersCompleted += new EventHandler<GetUsersCompletedEventArgs>(userServiceClient_GetUsersCompleted);
            userServiceClient.GetUsersAsync(searchString);

.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_UserService" 
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:52185/UserService.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_UserService" 
                  contract="UserService.UserService"
                  name="BasicHttpBinding_UserService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Shell.Silverlight.Web.Service3Behavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Shell.Silverlight.Web.Service3Behavior" 
                 name="Shell.Silverlight.Web.Service3">
            <endpoint address="" 
                      binding="basicHttpBinding" 
                      contract="Shell.Silverlight.Web.Service3" />
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

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

Решено!

Я не упоминал, что это приложение Silverlight. У меня была ссылка на wcf в DLL, у которой был собственный файл "ServiceReferences.ClientConfig". Я переместил содержимое DLL ServiceReferences.ClientConfig в основной проект silverlight, и это сработало.


что, если приложение, запускающее DLL, является сторонним, например DLL является плагином для другого приложения?
Стефанос Каргас,

Ответы:


186

У меня была такая же проблема. Мое приложение также было приложением Silverlight, и служба вызывалась из библиотеки классов с пользовательским элементом управления UserControl, который использовался в ней.

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


50
Это решение также подходит для проектов ASP.NET и MVC. Если вы добавите службу в библиотеку классов, она не сработает, возьмите раздел system.serviceModel из app.config в своем проекте библиотеки и поместите его в свой web.config.
Адам Поуп,

5
Похоже, это верно для любого проекта, я использовал quartz.net в качестве службы Windows и работал над другой сборкой, которая ссылалась на веб-службу. Это сработало и для меня. Спасибо.
тиаголеит 05

2
Привет, это сработало и для проекта Windows Phone. Как говорит @thiagoleite, похоже, он работает для большинства типов проектов.
Танушка

3
+1 за шутку про отпуск в Редмонде ... В любом случае, есть ли способ добавить его как внешний файл вместо того, чтобы играть с web.config?
Шимми Вайцхандлер

1
@sprite В итоге я установил свои требуемые настройки в коде (я переопределил конструктор клиента), как ответ Вишала . Таким образом, он передается по сборкам. Спасибо!
Шимми Вайцхандлер

45

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

BasicHttpBinding basicHttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basicHttpbinding.Name = "BasicHttpBinding_YourName";
basicHttpbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
basicHttpbinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

EndpointAddress endpointAddress = new EndpointAddress("http://<Your machine>/Service1/Service1.svc");
Service1Client proxyClient = new Service1Client(basicHttpbinding,endpointAddress);

@wooncherk, в моей библиотеке классов есть только ссылка на wsdl. Куда мне поместить этот код? Я встраиваю ее в библиотеку C # и помещаю ее в файлы приложения, где я ссылаюсь на нее из IronPython. Спасибо
Срба

12

На всякий случай, если кто-то столкнется с той же проблемой при использовании WPF (а не WCF или Silverlight):

У меня была эта ошибка при подключении к веб-службе. Когда мой код находился в «основном» решении для приложения WPF, никаких проблем, он работал отлично. Но когда я переместил код на более разумное решение на уровне DAL, возникло исключение.

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

Как было сказано в этой ветке "Sprite", вам нужно вручную скопировать тег.

Для приложений WPF это означает копирование тега из app.config в моем решении DAL в app.config в основном решении WPF Application.


это здорово, но было бы лучше в качестве краткого комментария под моим собственным ответом, как это сделал «Адам Поуп». Его прочитало бы намного больше людей.
спрайт

2
@sprite: Я бы добавил комментарий, но комментарии StackOverflow всегда отображаются как один длинный абзац. Для такого ответа из 5 абзацев, как мой, получился бы один длинный, нечитаемый и недружелюбный абзац. Написание отдельного ответа позволило мне дать более четкий ответ, который с большей вероятностью поможет другим пользователям (что, давайте посмотрим правде в глаза, и есть смысл таких веб-сайтов)
Майк Гледхилл

6

Я столкнулся с той же проблемой, по какой-то причине Visual Studio не обновила веб-конфигурацию, когда я впервые добавил службу. Я обнаружил, что обновление Service Reference также устранило эту проблему.

Шаги:

  1. Перейдите в папку ссылок на службы
  2. Разверните это
  3. Щелкните правой кнопкой мыши и выберите ссылку на службу обновления
  4. Наблюдайте за обновлением веб-конфигурации

Да, это помогло мне. Я использую ссылку на стороннюю службу wsdl и получал эту ошибку, пока не обновил ссылку на службу
ejhost

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

4

Измените web.config службы WCF на "endpoint address =" "binding =" basicHttpBinding "..." (ранее binding = "wsHttpBinding") После сборки приложения в конфигурации "ServiceReferences.ClientConfig" "" "> имеет значение . Тогда все будет нормально работать.


3

Переименуйте output.config, созданный svcutil.exe, в app.config. у меня это сработало.


2

У вас есть интерфейс, который реализует ваш класс "UserService".

Конечные точки должны указывать интерфейс для атрибута контракта:

contract="UserService.IUserService"


1

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

Обычно я пытаюсь называть свои конечные точки чем-то вроде «UserServiceBasicHttp» или чем-то подобным («Binding» здесь действительно нечего делать), и я пытаюсь вызвать свои конфигурации привязки с помощью «.... Configuration», например «UserServiceDefaultBinding», чтобы избежать возможных конфликтов имен.

Марк


0

Пришлось добавить службу в вызывающий файл App.config, чтобы он работал. Убедитесь, что вы это все-таки. Похоже, это сработало для меня.


0

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

Configuration config = new Configuration(dataRowSet[0]["ServiceUrl"].ToString());

var remoteAddress = new System.ServiceModel.EndpointAddress(config.Url);


SimpleService.PayPointSoapClient client = 
    new SimpleService.PayPointSoapClient(new System.ServiceModel.BasicHttpBinding(), 
    remoteAddress);
SimpleService.AccountcredResponse response = client.AccountCred(request);

0

Для тех, кто работает со службами AX 2012 AIF и пытается вызвать там проект C # или VB внутри AX (x ++) и страдает от таких ошибок, как «не удалось найти конечную точку по умолчанию» ... или «контракт не найден» ... вернуться в проект Visual Studio (c #) и добавьте эти строки перед определением клиента службы, затем разверните проект и перезапустите клиент AX и повторите попытку: Обратите внимание, что пример предназначен для адаптера NetTcp , вы можете легко использовать любой другой адаптер вместо этого в соответствии с вашими потребностями .

 Uri Address = new Uri("net.tcp://your-server:Port>/DynamicsAx/Services/your-port-name");
 NetTcpBinding Binding = new NetTcpBinding();
 EndpointAddress EndPointAddr = new EndpointAddress(Address);
 SalesOrderServiceClient Client = new SalesOrderServiceClient(Binding, EndPointAddr);

-2

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

Короче просто удалите его из библиотеки классов и поместите в стартовый проект.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.