Controlando a exposição no WSDL


Podem haver algumas situações onde você precisa tratar individualmente cada endpoint de seu serviço WCF. Como sabemos, cada endpoint tem três características básicas, conhecidas como Address, Binding e Contract. E pela estrutura do WCF, cada endpoint define toda a infraestrutura de acesso (binding) à um determinado serviço, expondo um conjunto de operações que podem ser utilizadas (contrato).

Muitas vezes temos contratos que são construídos para atender um “público” específico. Os contratos são desenhados afim de expor uma determinada funcionalidade, e um endpoint torna isso público para aqueles que estejam interessados em consumí-lo. Por exemplo, você possui um serviço expondo um contrato, mas agora você cria um novo contrato para ficar mais coerente com a necessidade atual, mas você não pode simplesmente remover o contrato (endpoint) antigo, pois há clientes consumindo o serviço através dele, mas o que você precisa fazer, é previnir que o endpoint que expõe o contrato antigo não esteja mais visível para os novos consumidores, pois estes já devem partir para o novo contrato.

Desde a primeira versão do WCF, há um behavior em nível de contrato chamado ServiceMetadataContractBehavior, que expõe uma propriedade boleana chamada MetadataGenerationDisabled, que quando definida como True e aplicado à um contrato específico, faz com que ele não seja colocado no documento WSDL, ocultando o ponto de acesso ao serviço qual aquele contrato está sendo exposto.

Mas infelizmente essa classe era internal, ou seja, não podíamos utilizá-la na configuração dos nossos serviços, o que obrigava a fazer um certo malabarismo caso tivéssemos que ocultar o endpoint que estava expondo aquele contrato. Com o intuito de facilitar isso, a Microsoft tornou essa classe pública na versão 4.0 do WCF.

Como ela é um behavior de contrato, temos que adicioná-la no local correto, e para isso recorremos à propriedade Contract, exposta através da classe ServiceEndpoint, que nos é retornada quando chamamos o método AddServiceEndpoint, já com todas as configurações informadas nos parâmetros do mesmo. A propriedade Contract é do tipo ContractDescription, que possui uma coleção chamada Behaviors, que aceita classes que implementam a interface IContractBehavior (para informações de estensibilidade, consulte este artigo). Abaixo estamos aplicando a instância da classe ServiceMetadataContractBehavior ao endpoint que expõe a funcionalidade em seu formato antigo, e logo em seguida, adicionamos um novo endpoint que estará visível aos novos clientes.

//Endpoint Antigo
host.AddServiceEndpoint
    (
        typeof(IContrato1), 
        new BasicHttpBinding(),
        “srv”
    ).Contract.Behaviors.Add(new ServiceMetadataContractBehavior() { MetadataGenerationDisabled = true });

//Endpoint Novo
host.AddServiceEndpoint(typeof(IContrato2), new BasicHttpBinding(), “srv1”);

É importante salientar que a aplicação deste behavior não faz com que requisições que chegam para aquele endpoint sejam rejeitadas. A ideia aqui é apenas evitar que ele seja exposto no documento WSDL, e faça com que os clientes antigos ainda continuem utilizando ele como forma de acessar o serviço.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s