Краткий ответ
Эта функциональность уже предоставляется "из коробки". С учетом аннотированного интерфейса:
[ServiceContract()]
interface IMath
{
[OperationContract()]
double Add(double A, double B);
}
Вы можете создать фабрику для указанной c привязки и конечной точки:
BasicHttpBinding myBinding = new BasicHttpBinding();
//configure the binding ........ then
EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1");
ChannelFactory<IMath> myChannelFactory = new ChannelFactory<IMath>(myBinding, myEndpoint);
// Create a channel.
IMath wcfClient1 = myChannelFactory.CreateChannel();
double s = wcfClient1.Add(3, 39);
Длинное объяснение
WCF уже предоставляет фабрики для всех этих вещей, на самом деле у них их слишком много и недостаточно документов - еще в 2008 году люди, хотя каждый создавал клиентский прокси из WSDL, совместимого со стандартом WS- *, и настраивали через * 1047. *.
Тогда все действительно думали, что XML - это решение всего, точно так же, как все думали, что JSON будет решением 5 лет go или YAML 2 года go.
Клиент использует поведение. Поведения объединяют конечные точки и привязки. Все они могут быть созданы в коде и вставлены по мере необходимости. WCF предоставляет инфраструктуру для загрузки настроек из файлов app.config / web.config. К сожалению, эта инфраструктура конфигурации не может быть легко настроена, и документы How To
не показывают весь процесс построения канала программно, потому что это считалось случаем advanced
.
Фабрики для привязок, конечных точек, конвертов сообщений, тел и т. Д. c. Никто не думал документировать их все, потому что они, хотя каждый будет использовать инструменты для генерации прокси.
Например, Обзор клиента WCF показывает, как создать интерфейс и клиентскую базу, но 4 из 5 конструкторов либо используют конфигурацию по умолчанию, либо ожидают имена конфигурации. Последний, тем не менее, принимает как Binding, так и EndpointAddress. Нет необходимости в жестком кодировании, например:
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{
public SampleServiceClient(Binding binding, EndpointAddress remoteAddress)
:base(binding, remoteAddress)
{
}
}
Генерировать этот код каждый раз нецелесообразно, особенно когда нужно изменить поведение. Например, чтобы добавить шифрование или проверить / изменить пользовательские заголовки. Поэтому WCF предлагает ChannelFactory для «продвинутого» сценария ios. Это также используется прокси-сервером для кэширования экземпляров поведения, привязки и конечных точек. Документы находятся в «расширенном» разделе, хотя Как: использовать ChannelFactory .
Из этого примера do c это так же просто, как:
[ServiceContract()]
interface IMath
{
[OperationContract()]
double Add(double A, double B);
}
private void Run()
{
BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1");
ChannelFactory<IMath> myChannelFactory = new ChannelFactory<IMath>(myBinding, myEndpoint);
// Create a channel.
IMath wcfClient1 = myChannelFactory.CreateChannel();
double s = wcfClient1.Add(3, 39);
}
Почему я написал примеры в обратном порядке?
Именно потому, что ChannelFactory «скрыт» в расширенных функциях. Сначала я нашел клиентский пример программы c, затем Настройка поведения клиента , который указывал на ClientFactory и, наконец, Как: использовать ChannelFactory .