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.

Foi útil?

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:

Será que nada disso ajuda?

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