Pergunta

Eu tenho 2 contratos (CA & CB) implementados por um único serviço WCF com 2 terminais (EPA e EPB).

Isto é não Para fins de segurança, mas apenas por razões de clareza/organização, eu gostaria de "ver" as operações da Contracta quando descobrir o serviço via EndPopa; E da mesma forma, veja apenas as operações do ContractB via endpointb.

Não preciso "proteger" essas operações em si. O cenário é tal que qualquer cliente precisa apenas de um "lado" do serviço, nunca ambos (mas as próprias operações compartilham recursos, por isso faz sentido ter um único serviço em vez de 2 serviços).

Parece que qualquer serviço dado obtém basicamente 1 WSDL, ERGO Todas as operações são expostas a todos os pontos de extremidade. É assim que funciona, ou existe uma maneira de "moldar" um ponto de extremidade ao ocluir operações não definidas pelo contrato de terminais?

Foi útil?

Solução

Por padrão, você está certo - uma classe de implementação de serviço recebe um WSDL que contém todos os métodos de serviço (de todos os contratos de serviço) que essa classe de serviço implementa.

Não há maneiras de presentes (até onde eu sei) para "moldar" o WSDL de qualquer maneira (fácil) - o WCF oferece maneiras de entrar no processo de criação do WSDL (estaticamente ou dinamicamente), mas esses não são para o fraco de coração. Seria muito mais fácil para você dividir a implementação dos contratos de serviço em duas classes separadas e, em seguida, você teria dois serviços separados, separou o WSDL e tudo.

Outras dicas

Marc está absolutamente certo. Estou apenas acrescentando por que isso acontece no WCF. No WCF, todos os metadados relacionados à funcionalidade são baseados no comportamento dos metadados de serviço e no ponto final do MEX. Ambos os recursos são definidos no nível de serviço. Portanto, você não pode assumir a granualidade mais alta (a menos que escreva muito código personalizado) e especifique os metadados por terminal.

O Serviço WCF (classe) é mapeado diretamente para o elemento WSDL: Serviço que expõe cada contrato como WSDL: Port (no WCF, conhecido como Endpoint). Este é o ponto principal de responder sua pergunta. Se você não deseja que seu segundo contrato nesse WSDL: Serviço não poderá implementá -lo na mesma classe.

Você mencionou que seus contratos de serviço compartilham recursos. Nesse caso, seu serviço WCF provavelmente também contém lógica de negócios. Essa é uma razão para seus problemas. O bom design para a implementação de serviços WCF é criá -los apenas como invólucros em torno de classes de lógica de negócios separadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top