Создавать конфигурации конечных точек WCF в клиентском приложении в коде?

Я пытаюсь использовать веб-службу WCF из клиентского приложения .NET и думаю, что мне нужно программно создавать конечные точки, но я не знаю, как это сделать. Я думаю, что мне нужно это сделать, потому что, когда я пытаюсь запустить приложение, я получаю следующую ошибку:

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

При устранении этой ошибки я создал простое приложение Windows Forms, в котором пытаюсь использовать ту же веб-службу. С помощью этого тестового приложения я могу успешно подключиться к веб-службе и получить действительный ответ. Но я могу воспроизвести точную ошибку, указанную выше, в своем тестовом приложении, удалив узел system.serviceModel и все его дочерние узлы из файла app.config приложения (возможно, мне не придется удалять ВЕСЬ этот раздел, я Точно сказать не могу). Итак, моя первая мысль заключалась в том, что мне нужно добавить этот раздел в файл app.config для реального приложения, и все должно быть в порядке. К сожалению, по смехотворным причинам, о которых я не буду здесь говорить, это не вариант. Итак, мне осталось генерировать эту информацию в коде внутри клиентского приложения.

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

Можно ли создавать конфигурации конечных точек в клиентском приложении в коде?


person campbelt    schedule 23.02.2011    source источник


Ответы (2)


По умолчанию, когда вы выполняете операцию Add Service Reference, среда выполнения WCF создает для вас прокси-сервер на стороне клиента.

Самый простой способ его использования — создать экземпляр клиентского прокси с конструктором, не принимающим параметров, и просто получить информацию из app.config:

YourServiceClient proxy = new YourServiceClient();

Для этого требуется, чтобы в файле конфигурации была запись <client> с вашим контрактом на обслуживание - если нет, вы получите ту ошибку, которая у вас есть.

Но прокси-класс на стороне клиента, сгенерированный средой выполнения WCF, также имеет дополнительные конструкторы — например, один принимает адрес конечной точки и привязку:

BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None);
EndpointAddress epa = new EndpointAddress("http://localhost:8282/basic");

YourServiceClient proxy = new YourServiceClient(binding, epa);

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

person marc_s    schedule 24.02.2011
comment
Это именно то, что мне нужно. Я не могу передать вам, насколько я ценю это! - person campbelt; 24.02.2011
comment
Что такое прокси YourServiceClient = new YourServiceClient(); ? это интерфейс? Это имя конечной точки, клиента? В app.config XAML это не позволяет мне добавлять имя к тегу ‹client›. - person Maverick Meerkat; 01.07.2017

Восточный способ использования службы WCF, если у вас есть ссылка на сборку, определяющую интерфейс, — это использование класса System.ServiceModel.ChannelFactory.

Например, если вы хотите использовать BasicHttpBinding:

var emailService = ChannelFactory<IEmailService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(new Uri("http://some-uri-here.com/));

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

person eulerfx    schedule 23.02.2011
comment
Спасибо, eulerfx. Я новичок во всем этом, поэтому я не уверен, как использовать переменную, когда она содержит данные, но я изучу этот угол и посмотрю, куда это меня приведет. - person campbelt; 24.02.2011
comment
Большое тебе спасибо! Я смог использовать ваше предложение вместе с ресурсом, расположенным по следующему адресу, чтобы решить эту проблему: msdn.microsoft.com/en-us/library/ms734681.aspx - person campbelt; 24.02.2011
comment
Arg... оказывается, хотя это позволяет моему тестовому приложению нормально работать без раздела system.serviceModel в app.config, по какой-то причине я все еще получаю ту же ошибку от реального приложения. Я буду продолжать исследования. - person campbelt; 24.02.2011
comment
@eulerfx, это отличный совет! таким образом не нужно создавать прокси-класс или добавлять ссылку на службу!! - person zaitsman; 16.07.2014