Versionar corpo de sabão contra serviço completo?

Estou a tentar entender versionamento com sabão e serviços web. Do que eu encontrei parece aceitável fazer algo assim com a URL:

Www.company.com/service/01-12-10/ e www.company.com/service/03-08-10/ e www.company.com/service / suporte a versão mais recente.

Eu entendo que este é o caminho a seguir em vez de apenas versionar o corpo de sabão / carga assim:
[client]

someRequest = newRequest(){ ClientVersion = "1.0.0" };
webService.Go(someRequest);

[web service]

if request.ClientVersion == "1.0.0"
  do this code
else
  do this code
Posso ver como todos os condicionalismos vão ficar fora de controlo à medida que as mudanças são made AND that this does not handle the case when a web method's signature is removed. Mais importante, no entanto, isso não é versionar todo o serviço, apenas o corpo.

então, a minha pergunta é: acertei ao mudar a URL para incluir a versão? Será que isto complementa todas as áreas necessárias? Parece que vou ter alguns conflitos de espaços de nomes? Também é necessário mudar os espaços de nomes? Tentando entender o que significa para a versão do serviço. Por favor expandir.

Author: O.O, 2012-11-09

1 answers

Fazer com que o cliente envie um parâmetro de versão normalmente não é preferido porque você não pode contar com o cliente para enviar o número de Versão adequado (se você tem várias versões do seu serviço web, você pode acabar recebendo uma carga útil para a versão X, mas marcado com um valor de parâmetro de versão Y).

Por esta razão, é melhor fazer valer a versão com o espaço de nomes do esquema do contrato, algo do género:
...
<types>
      <xs:schema xmlns="http://tempuri.org/v1"
                targetNamespace="http://tempuri.org/v1">
...

Quando você faz mudanças quebráveis na sua contract (Como remover uma operação) você quebra todos os seus clientes existentes, o que é um grande não a fazer, porque você basicamente torna o seu serviço web in-callable, assim inútil.

Então, quando você tem uma grande mudança de versão, você expõe um novo contrato que você agora define como:
...
<types>
      <xs:schema xmlns="http://tempuri.org/v2"
                targetNamespace="http://tempuri.org/v2">
...

Continua a apoiar v1 os clientes existentes enquanto utiliza v2 para que todos os novos clientes venham (e, felizmente, com o tempo, os seus clientes v1 possam migrar para v2).

Quando for necessário para suportar várias versões, você basicamente precisa gerenciar endpoints. Neste momento você pode ir para dois lados.

Ou mantém um objectivo como {[6] } que recebe todas as mensagens (v1 e v2) e actua como uma fachada para redireccionar para a implementação adequada com base no espaço de nomes da mensagem ou...

... você expõe directamente as versões como objectivos separados e os clientes existentes irão usar um objectivo antigo que recebe as mensagens v1 (talvez www.company.com/v1/service/) enquanto os novos clientes usam outro ponto final mais recente que recebe apenas Mensagens v2 (talvez www.company.com/v2/service/).

A configuração acima é mais fácil na Sua (apenas uma) implementação de negócios que é exposta aos clientes através de diferentes implementações de esqueleto do seu serviço web. Os esqueletos de v1 e v2 transformam os seus parâmetros específicos de carga útil em parâmetros adequados para a camada de Negócio. Desta forma, todas as chamadas convergem para a camada de negócio que neste momento normalmente não se importa que versão o cliente era.

Espero que agora seja mais claro...
 5
Author: Bogdan, 2017-05-23 11:46:18