Убедитесь, что интерфейс WCF одинаков между клиентскими и серверными приложениями. - PullRequest
2 голосов
/ 08 июня 2011

У нас есть служба Windows, которая подключается к различным клиентским приложениям через дуплексный канал WCF. Клиентские и серверные приложения устанавливаются на разных компьютерах, в разных местах, потенциально в разное время и разными людьми. Кроме того, клиент может указывать на другую машину при запуске той же службы Windows при запуске.

В дальнейшем мы знаем, что интерфейс между клиентскими и серверными приложениями, вероятно, будет развиваться. Приложение в полевых условиях будет администрироваться местным ИТ-персоналом, и мы не имеем никакого реального контроля над тем, какая версия одного из этих приложений будет установлена, когда / где или какая будет подключаться к другому. Поскольку они устанавливаются в разных физических местах и ​​разными людьми, высока вероятность того, что клиентское или серверное приложение будет устаревшим по сравнению с другим.

Поскольку мы не можем контролировать, какие версии приложений на местах пытаются соединиться друг с другом, я хотел бы иметь возможность проверить совместимость контрактов между клиентским приложением и серверным приложением.

Некоторые вещи, которые я ищу (возможно, не удастся получить их все):

  • Я не думаю, что меня волнует, является ли интерфейс сервера более новым или более старым, если интерфейс сервера является надмножеством клиентского
  • Я хочу использовать что-то кроме «номера версии интерфейса». Любой сохраненный разработчиком номер версии будет в конечном итоге забыт или пропущен.
  • Я бы хотел использовать сравнение вычислений интерфейса, если это возможно

Как я могу это сделать? Будем весьма благодарны за любые идеи о том, как это сделать.

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Похоже, это случай разработки вашего сервиса для управления версиями. WCF имеет очень хорошие возможности управления версиями и точки расширения. Вот несколько хороших статей в MSDN о версиях контракта на обслуживание и, более конкретно, контрактов на данные. Для получения версий с обратной и «прямой» совместимостью смотрите эту статью об использовании IExtensibleDataObject интерфейс.

0 голосов
/ 08 июня 2011

Если на конечной точке сервера включена публикация метаданных, вы можете программно проверить интерфейс конечной точки с помощью MetadataResolver class .Этот класс позволяет вам извлекать метаданные из конечной точки сервера, и в вашем случае вас заинтересует ContractDescription, которое содержит список всех операций.Затем вы можете сравнить список операций с операциями конечной точки вашего клиентского прокси .

Конечно, теперь нужно будет выполнить сравнение списков операций, вы можете просто сравнить имена операций ипотерпеть неудачу, если одна из операций клиента не найдена в операциях сервера.Это не обязательно покрывает все несовместимости, напр.Изменения в схеме запрос / ответ.

Кстати, я не пытался реализовать это, поэтому это скорее теоретический взгляд на вашу проблему.Если вы не хотите возиться с платформой, вы можете реализовать пользовательскую операцию, которая будет возвращать список имен операций.Это потребует минимальных усилий, но будет менее соответствовать стандартам.

...