Объекты запросов и ответов и управление версиями WCF - PullRequest
2 голосов
/ 25 января 2011

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

В более старых веб-службах ASMX я создавал бы объекты MethodNameRequest и MethodNameResponse для каждого метода веб-службы.

Объект запроса действительно был бы просто оберткой POCO вокруг того, что обычно было бы в параметрах метода. Объект ответа обычно может наследоваться от базового объекта ответа, который содержит информацию о любых ошибках.

Читая о WCF и о том, как работают IExtensibleDataObject, FaultContractAttribute и Namespace, кажется, что я могу вернуться к использованию стандартных параметров (string, int и т. Д.) В именах моих методов, и если служба версионирована, то ServiceContract наследование может обеспечить это управление версиями.

Я просматривал http://msdn.microsoft.com/en-us/library/ms731060.aspx и связанные с этим статьи, но я просто искал пояснения.

Правильно ли я считаю, что отказ от объектов Request / Response более идеален для создания версий WCF?

РЕДАКТИРОВАТЬ: Я только что нашел эту статью, которая предлагает использовать явный объект запроса / ответа: http://www.dasblonde.net/2006/01/05/VersioningWCFServiceContracts.aspx

Ответы [ 2 ]

4 голосов
/ 25 января 2011

Я не согласен с тем, что обходиться без объектов Request / Response - это путь.

Есть очевидные преимущества кодирования с сообщениями:

  • вы можете использовать их повторно, что позволяет избежать передачи 5 целых и 3 строк множеству различных методов.
  • свойства названы и поэтому могут быть надежно поняты, тогда как параметр, который передается по значению через несколько уровней, может быть перепутан и т. Д.
  • они могут быть собственными объектами, а не просто контейнерами данных, если вы выберете - содержащие частные методы и т. Д.

Но вы действительно спрашиваете о версии. Не забывайте, что вы можете создавать версии сообщений в рамках контрактов на обслуживание. Классы в сборке могут иметь одно и то же имя, если они находятся в разных пространствах имен (например, v1.Request и v2.Request), и они могут реализовывать необходимый интерфейс или наследовать от некоторого базового объекта.

Они также должны быть версионированы для вашего потребителя услуг, что можно сделать с помощью пространств имен xml; Обычно я помещаю сервисные контракты (операции) в пространство имен, например http://myapp.mydomain/v1, а сообщения (объекты запроса и ответа) - в http://myapp.mydomain/v1/messages.

Одна хитрость с этим подходом состоит в том, что если у вас есть операция, назовите ее Submit в пространстве имен http://myapp.mydomain/v1, тогда по соглашению / по умолчанию мыльные объекты SubmitRequest и SubmitResponse также будут существовать в том же пространстве имен (Я не помню, что такое исключение во время выполнения, но это меня немного смутило). Решение состоит в том, чтобы поместить объекты сообщения в другое пространство имен, как я описал выше.

0 голосов
...