WCF ChannelFactory vs генерация прокси



просто интересно, при каких обстоятельствах вы бы предпочли создать прокси-сервер из службы WCF, когда вы можете просто вызывать вызовы с помощью ChannelFactory?



таким образом, вам не придется создавать прокси и беспокоиться о регенерации прокси при обновлении сервера?



спасибо

724   6  

6 ответов:

существует 3 основных способа создания клиента WCF:

  1. пусть Visual Studio создаст ваш прокси. Это автоматически создает код, который подключается к службе, читая WSDL. Если служба изменяется по какой-либо причине, вы должны ее восстановить. Большим преимуществом этого является то, что его легко настроить - у VS есть Мастер, и все это автоматически. Недостатком является то, что вы полагаетесь на VS, чтобы сделать всю тяжелую работу за вас, и поэтому вы теряете управление.

  2. использовать ChannelFactory с известным интерфейсом. Это зависит от наличия локальных интерфейсов, описывающих службу (контракт на обслуживание). Большим преимуществом является то, что вы можете управлять изменениями гораздо проще - вам все еще нужно перекомпилировать и исправить изменения, но теперь вы не восстанавливаете код, вы ссылаетесь на новые интерфейсы. Обычно это используется, когда вы управляете как сервером, так и клиентом, поскольку оба они могут быть гораздо легче высмеяны для модульного тестирования. Однако интерфейсы можно написать для любого сервиса, даже для остальных - взгляните на этой странице.

  3. написать свой собственный прокси-это довольно легко сделать, особенно для служб REST, используя HttpClient или WebClient. Это дает вам самый мелкий контроль зерна, но за счет большого количества API службы, находящихся в строках. Например: var content = new HttpClient().Get("http://yoursite.com/resource/id").Content; - Если детали изменения API вы не столкнетесь с ошибкой до времени выполнения.

лично я никогда не любил Вариант 1-полагаясь на автоматически сгенерированный код грязно и теряет слишком много контроля. Кроме того, он часто создает проблемы с сериализацией - я получаю два одинаковых класса (один в коде сервера, один автоматически сгенерированный), которые могут быть улучшены, но это боль.

Вариант 2 должен быть идеальным, но каналы слишком ограничены - например, они полностью потерять содержимое ошибок HTTP. Тем не менее, наличие интерфейсов, описывающих службу, намного проще код С и поддерживать.

Я использую ChannelFactory вместе с MetadataResolver.Метод разрешения. Конфигурация клиента-это проблема, поэтому я получаю свою ServiceEndpoint с сервера.

при использовании ChannelFactory (Of T) T является либо исходным контрактом, который можно получить из ссылки в проекте, либо сгенерированным экземпляром контракта. В некоторых проектах я сгенерировал код из ссылки на службу, потому что не смог добавить ссылку на dll контракта. Вы даже можете создать контракт asynch с помощью ссылка на службу и использование этого интерфейса контракта с 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.труба, если таковая имеется. Таким образом, я могу использовать лучшие доступные привязки для моих нужд. Я полагаюсь только на то, что метаданные конечная точка существует на сервере.

надеюсь, это поможет

кстати, это делается с помощью .NET 3.5. Однако он работает и с 4.0.

чтобы использовать ChannelFactory<T> вы должны быть готовы делиться сборками контрактов между службой и клиентом. Если это нормально с вами, то ChannelFactory<T> может сэкономить вам некоторое время.

прокси будет строить асинхронные функции, для которых это довольно приятно.

мой ответ-это своего рода резюме Кит и Андрей Зайцев ответы.

Если вы не управляете сервером, но имеете только WSDL/URL - создайте прокси с помощью Visual Studio или svcutil. (Обратите внимание, что Visual Studio иногда терпит неудачу, когда svcutil работает лучше).

когда вы управляете как сервером, так и клиентом, поделитесь интерфейсами/контрактами и вызовите ChannelFactory
.

Это не просто вопрос экономии времени. Использование созданного прокси-сервера WSDL опасно, поскольку если вы забудете обновить ссылку на службу, вы можете оставить решение в несогласованном состоянии. Все компилируется, но контракт на обслуживание нарушен. Я определенно предлагаю использовать ChannelFactory, когда это возможно, вы делаете свою жизнь намного проще.

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

Comments

    Ничего не найдено.