serviços Web e compatibilidade de interface
-
20-08-2019 - |
Pergunta
Como adicionar uma referência de serviço para um serviço web (isto é tudo WCF) no Visual Studio produz algum código gerado incluindo uma correção do lado do cliente da interface a ser exposta.
Eu entendo por que essa interface é gerado: você pode estar consumindo um terceiro partido serviço e não têm acesso à interface real
.Mas eu faço, e os dois são não atribuição compatível, embora o proxy transparente, de fato, exatamente implementar a interface a que eu quero elenco.
Eu posso usar a reflexão, mas isso é feio. Existe alguma maneira de derrotar esse tipo de segurança falso e metadados injetar para que eu possa usar uma interface com uma classe?
As minhas afasta problemas específicos da norma de maneiras complicadas que têm a ver com um único cliente que utiliza alguns derivados de uma classe base direta e usos outros remotamente via referências de serviço. A classe base para cada servidor precisa manter as referências à subscrição clientes em uma coleção para a enumeração para notificar eventos, eo problema era tipo variou devido ao uso de proxies.
Nenhuma dessas respostas resolve meu problema específico, mas cada resposta única foi instrutivo e útil. Eu encontrei a minha própria solução (usar uma dupla ligação), mas eu nunca percebi isso, se você não tinha melhorado radicalmente a minha compreensão de todo o negócio.
Três respostas excelentes. Como escolher apenas um? I escolher o primeiro, porque ele resolve diretamente o problema que eu primeira pensamento que eu tinha.
Solução
Quando você adiciona a referência de serviço, vá para o "Advanced" e certifique-se "tipos de reutilização em assemblies referenciados" está selecionado e que o conjunto contendo a definição de sua interface é selecionado. Você também pode fazer isso com uma referência de serviço existente com o botão direito sobre ele e vai "Configurar".
Outras dicas
Se você já tem o dll contrato com o cliente, você não precisa sequer de um serviço de referência (a menos que você estiver usando-o para escrever o código de configuração para você) - você pode ClientBase simplesmente subclasse e expor o Canal da Mancha, e da utilização que direta - algo como (não IDE calhar ...):
public class WcfClient<T> : ClientBase<T> where T : class
{
public new T Channel {get {return base.Channel;}}
}
Em seguida, você pode apenas fazer coisas como:
using(var client = new WcfClient<IFoo>())
{
client.Channel.Bar(); // defined by IFoo
}
Você ainda precisa as definições de configuração na configuração para determinar o endereço, encadernação, etc - mas menos confuso do que a geração proxy. Além disso, você pode optar por voltar a implementar IDipsoable
para lidar com o fato de que proxies WCF pode jogar em Dispose()
(que é ruim):
public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
public new T Channel {get {return base.Channel;}}
void IDisposable.Dispose() {
try {
switch(State) {
case CommunicationState.Open: Close(); break;
// etc
}
} catch {} // swallow it down (perhaps log it first)
}
}
Para retornar uma interface de um serviço que você precisa usar o atributo KnownType:
-
Se você quiser retornar um tipo personalizado do serviço:
Será que nada disso ajuda?