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

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

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

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

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

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

Ответ 1

По умолчанию, когда вы выполняете операцию 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);

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

Ответ 2

На восточном пути использования WCF-сервиса, если у вас есть ссылка на сборку, которая определяет интерфейс, используется класс System.ServiceModel.ChannelFactory.

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

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

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