WCF - geração WDSL personalizada
-
29-10-2019 - |
Pergunta
Eu passei horas tentando fazer algumas personalizações na geração do WSDL, sem resultados. Eu fiquei preso principalmente porque não consegui encontrar uma amostra clara para o que eu quero fazer (eu posso ter perdido alguma coisa).
Vamos ao ponto: eu quero personalizar o WSDL gerado. Os artigos mais relevantes que encontrei são sobre adicionar atributos aos serviços existentes para adicionar comportamento, assim Artigo .
O que eu quero fazer é ser capaz de analisar o operationcontract e gerar e adicional xsd, se necessário.
minhas perguntas são:
- Como você pode adicionar ou interceptar a geração WSDL existente sem adicionar atributos ?
- Como configuro este componente no arquivo de configuração?
Eu não quero mudar a maneira como os metadados são consumidos por svcutil.exe , basta adicionar algum complexpype 'on-the-fly' no WSDL gerado.
Obrigado por suas sugestões!
Solução
O que você precisa é implementar IWsdlExportExtension.ExportContract
, mas a documentação afirma claramente:
O método ExportContract é chamado quando o sistema de exportação de metadados é exportar o contrato. Só contrato e implementação de comportamentos de operação IWsdlExportExtension obter o Chamada ExportContract. Todos os comportamentos implementação de IWsdlExportExtension get a chamada ExportEndpoint.
Para mim, isso significa que este método é chamado apenas quando implementado por contrato ou comportamento de operação que geralmente é definido por atributo personalizado, mas você também deve ser capaz de atribuir esses comportamentos na inicialização personalizada. Aqui está o exemplo da extensão WSDL para endpoint configurado a partir do arquivo de configuração (a configuração oferece apenas comportamentos para todo o serviço e endpoints). Eu acredito (mas não testei) que você pode fazer extensões semelhantes que consistirão em:
- Comportamento de operação ou contrato implementar
IWsdlExportExtension
eExportContract
- Comportamento do endpoint que implementará
IEndpointBehavior
eApplyDispatchBehavior
. EmApplyDispatchBehavior
, você usaráserviceEndpoint.Contract.Behaviors
para adicionar o comportamento do contrato ouserviceEndpoint.Contract.Operations[x].Behaviors
para adicionar o comportamento da operação. - Você criará
BehaviorExtensionElement
semelhante para definir o comportamento do seu novo endpoint a partir do arquivo de configuração.