Я використовую ChannelFactory разом із методом MetadataResolver.Resolve. Клієнтська конфігурація заважає, тому я отримую ServiceEndpoint з сервера.
Коли ви використовуєте ChannelFactory (Of T), T - це або оригінальний контракт, який ви можете отримати за допомогою посилання у вашому проекті, або згенерований екземпляр контракту. У деяких проектах я згенерував код із посилання на сервіс, оскільки не зміг додати посилання на DLL контракту. Ви навіть можете створити асинхронний контракт із посиланням на службу і використовувати цей інтерфейс контракту з ChannelFactory.
Основним пунктом використання ChannelFactory для мене було позбавлення інформації про конфігурацію клієнта WCF. У прикладі коду нижче ви можете побачити, як досягти клієнта WCF без конфігурації.
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()
У моєму остаточному проекті наявні прив'язки перевіряються на використання net.tcp або net.pipe, якщо такі є. Таким чином, я можу використовувати найкраще з наявних прив’язок для своїх потреб. Я покладаюся лише на той факт, що кінцева точка метаданих існує на сервері.
Сподіваюся, це допоможе
До речі, це робиться за допомогою .NET 3.5. Однак він працює і з 4.0.