Partilhar via


Arquitetura do Cliente

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

Descrição geral

O tempo de execução do modelo de serviço cria clientes 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 de retorno 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, mais notavelmente a capacidade de fechar a sessão do cliente e descartar o canal.

  • Um canal de cliente que é 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 ClientBase<TChannel> classe derivada conforme ela é gerada pela ServiceModel Metadata Utility Tool (Svcutil.exe). Essas classes de cliente prontas encapsulam e delegam a uma implementação de canal cliente que é construída dinamicamente por um ChannelFactoryarquivo . Portanto, o canal do cliente e a fábrica de canais que os produz são o ponto focal de interesse para esta discussão.

Objetos do cliente e canais do cliente

A interface base dos clientes WCF é a interface, que expõe a System.ServiceModel.IClientChannel 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>.

A IClientChannel interface, no entanto, não define um contrato de serviço em si. Eles são declarados pela interface do contrato de serviço (normalmente gerados a partir de metadados de serviço usando uma ferramenta como a ServiceModel Metadata Utility Tool (Svcutil.exe)). Os tipos de cliente WCF estendem ambos IClientChannel e a interface do contrato de serviço de destino para permitir que os aplicativos chamem operações diretamente e também tenham acesso à funcionalidade de tempo de execução do lado do cliente. A criação de um cliente WCF fornece aos objetos WCFSystem.ServiceModel.ChannelFactory 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.

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

O segundo tipo é gerado em tempo de execução de uma chamada para o CreateChannel método. Os aplicativos preocupados com o controle rígido das especificidades de comunicação normalmente usam esse tipo de cliente, chamado de objeto de canal do cliente, porque ele permite uma interação mais direta do que o tempo de execução do cliente subjacente e o sistema de canal.

Fábricas de Canal

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

A coisa importante a lembrar sobre fábricas de canais é que eles criam novas instâncias de canais de cliente para a configuração fornecida a eles antes de chamar ChannelFactory<TChannel>.CreateChannel. Depois de chamar CreateChannel (ou ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannelou qualquer operação em um objeto de cliente WCF), você não pode 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. Se você quiser criar um objeto cliente ou canal de cliente com uma configuração diferente, você deve criar uma nova fábrica de canal primeiro.

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

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

Criando um novo objeto de canal de cliente WCF

Para ilustrar o uso de um canal de cliente, suponha que o seguinte contrato de serviço tenha sido 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 ISampleService serviço, 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 CreateChannel método para retornar objetos de canal do cliente que você pode usar para se comunicar com um ISampleService serviço.

Ao usar a ChannelFactory<TChannel> classe com uma interface de contrato de serviço, você deve transmitir para a IClientChannel interface 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 permite que você interaja com a infraestrutura do canal do cliente sem ter que transmitir. 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
{
}

Criando um novo objeto de canal de cliente WCF

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

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

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

Para obter um exemplo, consulte Como: Usar o ChannelFactory.