Итак, вы делаете «серверный пуш»? то есть ваше оборудование с фиксированным IP ведет себя как клиент, а на динамических IP-машинах работает ServiceHosts?
Мне бы очень хотелось, чтобы был «умный слой», который можно было бы просто уложить на место, чтобы иметь дело с версионированием здесь - но на самом деле волшебной пули нет.
IExtensibleObject на самом деле просто поддерживает данные для циклического переключения, но если сервер имеет только старый контракт, то он также будет иметь только старую реализацию, поэтому он не сможет «использовать» эту «расширенную» информацию.
Есть несколько практик, которым вы могли бы следовать. Основное отличие состоит в том, что нужно менять номера версий или не делать ... в случае контрактов WCF номер версии как таковой отсутствует, но версия кодируется в пространстве имен контракта / URI.
Если вы не измените пространство имен, то вы в основном говорите: «У меня будет один сервис, который НИКОГДА не нарушит обратную совместимость (ну, для версий X)». Затем вы должны применить строгую практику разработки, чтобы гарантировать, что никакие методы не будут изменены или удалены, только дополнения могут быть сделаны. Это предотвратит отправку клиентом запросов, которые сервер больше не понимает.
Другой подход заключается в изменении URI / пространства имен контракта WCF при каждом пересмотре контракта. Тогда у вашего «сервера» будет реализация КАЖДОЙ версии контракта, которую вы хотите поддержать. Например, если вы поддерживаете клиентов для 3 предыдущих версий, возможно, они работают с последним сервером WCF, но клиент WCF должен быть не старше 3 версий, иначе сервер WCF не будет понимать запрос (потому что URI / контракт пространство имен не будет существовать).
Обычно это тот подход, который я выбираю.
Для этого у меня есть многоуровневый подход
Контракты WCF
Они очень статичны, меняются только в случае крайней необходимости
Каждый новый контракт получает новое пространство имен / URI
Контракты НЕ наследуются от предыдущей версии - это не позволит вам отказаться от функциональности.
Реализация службы WCF
Эта реализация, или реализации, является просто уровнем SHIM - она получает запрос и передает его соответствующему логическому уровню.
Логический слой / адаптеры
если запрос поступил по последней версии контракта, то он немедленно обрабатывается.
если запрос поступил по контракту с предыдущей версией, для этой версии находится адаптер (это может на самом деле произойти в реализации службы, если хотите), и запрос передается адаптеру.
Адаптеры отвечают за получение старого запроса и его адаптацию к пространству имен следующей более новой версии. Это работает в цепочке, например, если запрос получен от клиента v1.0, к серверу v1.3
1.0 contract ->
1.0 to 1.1 adapter ->
1.1 to 1.2 adapter ->
1.2 to 1.3 adapter -> 1,3 implementation. (and back if not one-way)
Каждый адаптер имеет возможность выполнить подготовку запроса к обработке следующей версией.
Например, в методе 1.1 вы, возможно, ввели требование об «дате запроса», но вы знаете, что можете «сделать наилучшее предположение», поэтому вы добавляете этот аргумент в адаптер 1.0 перед передачей запроса. к логике 1.1.
Помните, что все еще возможно ввести требования, которые нельзя «принять» или «не выполнить по умолчанию» - это приведет к нарушению договорных изменений, и вы захотите сделать это только тогда, когда это абсолютно необходимо. Но поскольку вы еще не связали свои контракты, вы можете некоторое время поддерживать оба метода, а затем отбросить старый контракт из службы поддержки, и все его старые методы исчезнут.
Далее, у вас также есть возможность разделить ваши сущности в другое пространство имен, которое может иметь версии независимо от логических контрактов. Еще один чайник с рыбой.
Вам также нужно решить, как долго вы хотите поддерживать старые контракты - чем дольше вы их поддерживаете, тем сложнее будет ваша логика «обработки версий».Хорошая вещь о связывании этой логики в реализации, подобной приведенной выше, заключается в том, что после того, как вы написали слой адаптера для конкретной версии, вам больше не придется его пересматривать.
Надеюсь, это дало вам возможность подуматьо.