Я использую ChannelFactory вместе с методом MetadataResolver.Resolve. Конфигурация клиента мешает, поэтому я получаю свою ServiceEndpoint с сервера.
Когда вы используете ChannelFactory (Of T), T - это либо исходный контракт, который вы можете получить из ссылки в вашем проекте, либо созданный экземпляр контракта. В некоторых проектах я генерировал код из ссылки на службу, потому что не мог добавить ссылку на dll контракта. Вы даже можете создать асинхронный контракт со ссылкой на службу и использовать этот интерфейс контракта с ChannelFactory.
Для меня основной целью использования ChannelFactory было избавление от информации о конфигурации клиента WCF. В приведенном ниже примере кода вы можете увидеть, как создать клиент WCF без config.
Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()
В моем последнем проекте availableBindings проверяется на использование net.tcp или net.pipe, если они доступны. Таким образом, я могу использовать наилучшую доступную привязку для своих нужд. Я полагаюсь только на то, что конечная точка метаданных существует на сервере.
надеюсь, это поможет
Кстати, это делается с помощью .NET 3.5. Однако он работает и с 4.0.