Каков наилучший способ создания версии веб-службы ASP.NET 2.0? - PullRequest
8 голосов
/ 29 мая 2009

Я поддерживаю веб-службу SOAP (ASP.NET версии 2.0), и мне нужно внести некоторые изменения, которые изменят возвращаемые значения определенных методов.

Каков общепринятый способ сделать это без нарушения существующих реализаций.

Вначале я думал, что все это будет возможно.

a) Предоставить методы, специфичные для новой версии, в существующей веб-службе, например, getPerson_v1.4
б) Предоставьте полную копию файла .asmx с новым номером версии, например, Http: /www.example.com/AdminWS_V1_4.asmx. Это не идея, которой я наслаждаюсь, поскольку у сервиса более 50 методов, и копирование этого кода для изменений в методах 2/3 кажется слишком дублированным кодом. c) Переопределить конструктор веб-службы, чтобы разрешить передачу номера версии. Это не похоже на работу, и, если подумать, я не уверен, как это будет представлено в WSDL

Существует ли общепринятый способ сделать это, или у людей есть совет, основанный на их опыте в этой области.

Ответы [ 5 ]

7 голосов
/ 29 мая 2009

Развертываем в каталогах версий, например:

http://www.example.com/soap/v1/ http://www.example.com/soap/v2/ http://www.example.com/soap/v3/

и т.д.

6 голосов
/ 29 мая 2009

В общем случае управление версиями веб-службы - это больше, чем просто имена методов контроля версий и имена файлов .asmx. В идеале интерфейс к веб-службе (его WSDL) должен быть постоянным контрактом и никогда не должен изменяться. Одним из последствий этого будет то, что клиентам, которым не нужны измененные функциональные возможности, никогда не потребуется изменять, и, следовательно, никогда не потребуется повторное тестирование.

Вместо того, чтобы нарушать существующий контракт, вы должны создать новый контракт, содержащий измененные операции. Этот контракт может «наследовать» от существующего контракта, то есть вы можете «добавить методы в конец». Однако обратите внимание, что вы также должны поместить новый контракт в новое пространство имен XML - пространство имен в основном идентифицирует WSDL, и сохранение пространства имен, но изменение WSDL было бы ложью.

Затем вы должны реализовать этот новый контракт в новой конечной точке (файл .asmx). Находится ли это в другом каталоге или даже на другом веб-сайте, не имеет значения. Важно то, что клиенты, которым нужны новые функциональные возможности, могут ссылаться на новый WSDL по новому URL-адресу и вызывать новую службу по новому URL-адресу и быть счастливыми.

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

2 голосов
/ 30 мая 2009

У меня та же проблема с версиями веб-сервисов, которую я разрабатываю. Мы заставляем наших пользователей передавать номер версии схемы в шапке. Они говорят нам, какую версию XML-схемы они хотят вернуть. Таким образом, мы всегда обратно совместимы, и код не дублируется.

На моей работе мы не можем сказать клиенту, что он должен переключить URL-адрес на веб-сервис, когда мы его версии. В больших корпорациях изменения, такие как URL, могут занять месяцы тестирования. Я чувствую, что вы не должны разрывать связь с вашими клиентами. Что мы делаем, так это добавляем новые функции в последнюю версию. Когда клиент запрашивает новые функции, если они хотят, они вынуждены обновиться до новейшей схемы.

2 голосов
/ 29 мая 2009

Я только что подумал о другом возможном решении, которое кажется довольно чистым.

Я мог бы проверить номер версии, включенный в качестве заголовка SOAP, и предположить существующий номер версии, если он не указан.

Затем я могу заставить код вести себя по-разному для разных версий без изменения сигнатур метода. Это возможно, поскольку возвращаемые значения из Web-сервисов являются объектами XML, поэтому сигнатура метода остается той же самой, но содержание XML изменяется в зависимости от версии.

0 голосов
/ 29 мая 2009

Если вы не меняете большинство сигнатур методов с каждой новой версией, я бы использовал (а) - версионные имена методов. Это то, как наши провайдеры делают это, и у нас это хорошо работает.

...