Arquitetura do cliente

Os aplicativos usam objetos de cliente do WCF (Windows Communication Foundation) para invocar operações de serviço. Este tópico discute objetos de cliente do WCF, canais de cliente do WCF e suas relações com a arquitetura de canal subjacente. Para obter uma visão geral básica dos objetos de cliente do WCF, consulte a Visão geral de cliente do WCF. Para obter mais informações sobre a camada de canal, consulte Estender a camada de canal.

Visão geral

O tempo de execução do modelo de serviço cria clientes do WCF, que são compostos do seguinte:

  • Uma implementação de cliente gerada automaticamente de um contrato de serviço, que transforma chamadas do código do aplicativo em mensagens de saída e transforma mensagens de resposta em parâmetros de saída e valores retornados que seu aplicativo pode recuperar.

  • Uma implementação de uma interface de controle (System.ServiceModel.IClientChannel) que agrupa várias interfaces e fornece acesso à funcionalidade de controle, principalmente a capacidade de fechar a sessão do cliente e descartar o canal.

  • Um canal cliente criado com base nas definições de configuração especificadas pela associação usada.

Os aplicativos podem criar esses clientes sob demanda, por meio de uma System.ServiceModel.ChannelFactory ou criando uma instância de uma classe derivada ClientBase<TChannel>, pois ela é gerada pela Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe). Essas classes de cliente prontas encapsulam e delegam para uma implementação de canal de cliente que é construída dinamicamente por um ChannelFactory. Portanto, o canal cliente e a fábrica de canais que os produz são o ponto de interesse principal para essa discussão.

Objetos de cliente e canais de cliente

A interface base de clientes do WCF é a interface System.ServiceModel.IClientChannel, que expõe a funcionalidade principal do cliente, bem como a funcionalidade básica do objeto de comunicação de System.ServiceModel.ICommunicationObject, a funcionalidade de contexto de System.ServiceModel.IContextChannel e o comportamento extensível de System.ServiceModel.IExtensibleObject<T>.

No entanto, a interface IClientChannel não define um contrato de serviço por si mesmo. Estes são declarados pela interface do contrato de serviço (normalmente gerada a partir de metadados de serviço usando uma ferramenta como a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe)). Os tipos de cliente do WCF estendem as duas IClientChannel e a interface do contrato de serviço de destino para permitir que os aplicativos chamem as operações diretamente e também tenham acesso à funcionalidade de tempo de execução do lado do cliente. A criação de um cliente do WCF fornece aos objetos System.ServiceModel.ChannelFactory do WCF as informações necessárias para criar um tempo de execução que possa se conectar e interagir com o ponto de extremidade de serviço configurado.

Conforme mencionado anteriormente, os dois tipos de cliente do WCF devem ser configurados antes de serem usados. Os tipos de cliente mais simples do WCF são objetos que derivam de ClientBase<TChannel> (ou DuplexClientBase<TChannel> se o contrato de serviço é um contrato duplex). Você pode criar esses tipos usando um construtor, configurado programaticamente ou usando um arquivo de configuração e chamado diretamente para invocar operações de serviço. Para obter uma visão geral básica dos objetos ClientBase<TChannel>, consulte a Visão geral de cliente do WCF.

O segundo tipo é gerado no tempo de execução de uma chamada para o método CreateChannel. Aplicativos preocupados com o controle rigoroso das especificações de comunicação normalmente usam esse tipo de cliente, chamado de objeto de canal do cliente, pois ele permite uma interação mais direta do que o sistema de canal e tempo de execução do cliente subjacente.

Fábricas de canal

A classe responsável por criar o tempo de execução subjacente que dá suporte a invocações de cliente é a classe System.ServiceModel.ChannelFactory<TChannel>. Tanto objetos de cliente do WCF quanto objetos de canal de cliente do WCF usam um objeto ChannelFactory<TChannel> para criar instâncias. O objeto de cliente ClientBase<TChannel> derivado encapsula o tratamento da fábrica de canais, mas para vários cenários é perfeitamente razoável usar direto a fábrica de canais. O cenário comum para isso é se você desejar criar repetidamente novos canais de cliente a partir de uma fábrica existente. Se você estiver usando um objeto de cliente, poderá obter a fábrica de canais subjacente de um objeto de cliente do WCF chamando a propriedade ClientBase<TChannel>.ChannelFactory.

O importante para lembrar sobre as fábricas de canais é que elas criam novas instâncias de canais de cliente para a configuração fornecida a elas antes de chamar ChannelFactory<TChannel>.CreateChannel. Depois de chamar CreateChannel (ou ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel ou qualquer operação em um objeto de cliente do WCF), você não poderá modificar a fábrica de canais e esperar obter canais para instâncias de serviço diferentes, mesmo que você esteja apenas alterando o endereço do ponto de extremidade de destino. Caso deseje criar um objeto de cliente ou canal de cliente com uma configuração diferente, primeiro você deve criar uma nova fábrica de canais.

Para obter mais informações sobre vários problemas usando objetos de cliente do WCF e canais de cliente do WCF, consulte Acessar serviços usando um cliente do WCF.

As duas seções a seguir descrevem a criação e o uso de objetos de canal de cliente do WCF.

Criar um objeto de canal de cliente do WCF

Para ilustrar o uso de um canal de cliente, considere que o seguinte contrato de serviço foi gerado.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Para se conectar a um serviço ISampleService, use a interface de contrato gerada diretamente com uma fábrica de canais (ChannelFactory<TChannel>). Depois de criar e configurar uma fábrica de canais para um contrato específico, você pode chamar o método CreateChannel para retornar objetos de canal do cliente que você pode usar para se comunicar com um serviço ISampleService.

Ao usar a classe ChannelFactory<TChannel> com uma interface de contrato de serviço, você deve converter para a interface IClientChannel para abrir, fechar ou anular explicitamente o canal. Para facilitar o trabalho, a ferramenta Svcutil.exe também gera uma interface auxiliar que implementa a interface do contrato de serviço e IClientChannel para permitir que você interaja com a infraestrutura do canal do cliente sem ter que converter. O código a seguir mostra a definição de um canal de cliente auxiliar que implementa o contrato de serviço anterior.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Criar um objeto de canal de cliente do WCF

Para usar um canal cliente para se conectar a um serviço ISampleService, use a interface de contrato gerada (ou a versão auxiliar) diretamente com uma fábrica de canais, passando o tipo da interface do contrato como o parâmetro de tipo. Após criar e configurar uma fábrica de canais para um contrato específico, você pode chamar o método ChannelFactory<TChannel>.CreateChannel para retornar objetos de canal do cliente que você pode usar para se comunicar com um serviço ISampleService.

Quando criados, os objetos de canal do cliente implementam IClientChannel e a interface do contrato. Portanto, você pode usá-las diretamente para chamar operações que interagem com um serviço que dá suporte a esse contrato.

A diferença entre o uso de objetos cliente e objetos de canal de cliente é apenas um controle e a facilidade de uso para desenvolvedores. Muitos desenvolvedores que se sentem confortáveis em trabalhar com classes e objetos vão preferir usar o objeto de cliente do WCF em vez do canal de cliente do WCF.

Para obter um exemplo, consulte Como usar o ChannelFactory.