Compartilhar via


Visão geral de modelo de canal

A pilha de canais do WCF (Windows Communication Foundation) é uma pilha de comunicação em camadas com um ou mais canais que processam mensagens. Na parte inferior da pilha há um canal de transporte responsável por adaptar a pilha de canais ao transporte subjacente (por exemplo, TCP, HTTP, SMTP e outros tipos de transporte). Os canais fornecem um modelo de programação de baixo nível para enviar e receber mensagens. Esse modelo de programação depende de várias interfaces e outros tipos coletivamente conhecidos como o modelo de canal do WCF. Este tópico discute formas de canal, a construção de um ouvinte de canais básicos (no serviço) e a fábrica de canais (no cliente).

Pilha de canais

Os pontos de extremidade do WCF se comunicam com o mundo usando uma pilha de comunicação chamada pilha de canais. O diagrama a seguir compara a pilha de canais com outras pilhas de comunicação, por exemplo, TCP/IP.

Channel Model

Primeiro, as semelhanças: em ambos os casos, cada camada da pilha fornece alguma abstração do mundo abaixo dessa camada e expõe essa abstração apenas à camada diretamente acima dela. Cada camada usa a abstração apenas da camada diretamente abaixo dela. Também em ambos os casos, quando duas pilhas se comunicam, cada camada se comunica com a camada correspondente na outra pilha, por exemplo, a camada IP se comunica com a camada IP e a camada TCP com a camada TCP e assim por diante.

Agora, as diferenças: embora a pilha TCP tenha sido projetada para fornecer uma abstração da rede física, a pilha de canais foi projetada para fornecer uma abstração não apenas de como a mensagem é entregue, ou seja, o transporte, mas também outros recursos, como o que está na mensagem ou qual protocolo é usado para comunicação, incluindo o transporte, mas muito mais do que isso. Por exemplo, o elemento de associação de sessão confiável faz parte da pilha de canais, mas não está abaixo do transporte ou do transporte em si. Essa abstração é obtida exigindo que o canal inferior na pilha adapte o protocolo de transporte subjacente à arquitetura da pilha de canais e, em seguida, contando com canais mais acima na pilha para fornecer recursos de comunicação, como garantias de confiabilidade e segurança.

As mensagens fluem pela pilha de comunicação como objetos Message. Conforme mostrado na figura acima, o canal inferior é chamado de canal de transporte. Ele é o canal responsável por enviar e receber mensagens de e para outras partes. Isso inclui a responsabilidade de transformar o objeto Message de e para o formato usado para se comunicar com outras partes. Acima do canal de transporte pode haver qualquer número de canais de protocolo, cada um responsável por fornecer uma função de comunicação, como garantias de entrega confiáveis. Os canais de protocolo operam em mensagens que fluem por elas na forma do objeto Message. Eles normalmente transformam a mensagem, por exemplo, adicionando cabeçalhos ou criptografando o corpo, ou enviam e recebem suas próprias mensagens de controle de protocolo, por exemplo, confirmações de recebimento.

Formas do canal

Cada canal implementa uma ou mais interfaces conhecidas como interfaces de forma de canal ou formas de canal. Essas formas de canal fornecem os métodos orientados à comunicação, como enviar e receber ou solicitar e responder que o canal implementa e o usuário das chamadas de canal. Na base das formas de canal está a interface IChannel, que é uma interface que fornece um método GetProperty<T> destinado como um mecanismo em camadas para acessar recursos arbitrários expostos por canais na pilha. As cinco formas de canal que estendem IChannel são:

Além disso, cada uma dessas formas tem um equivalente que estende System.ServiceModel.Channels.ISessionChannel<TSession> para dar suporte às sessões. Estes são:

As formas de canal são padronizadas após alguns dos padrões fundamentais de troca de mensagens compatíveis com os protocolos de transporte existentes. Por exemplo, mensagens unidirecionais correspondem a um par IInputChannel/IOutputChannel, solicitação-resposta corresponde aos pares IRequestChannel/IReplyChannel e comunicações duplex bidirecionais correspondem a IDuplexChannel (que estende IInputChannel e IOutputChannel).

Programação com a pilha de canais

As pilhas de canais normalmente são criadas usando um padrão de fábrica em que uma associação cria a pilha de canais. No lado do envio, uma associação é usada para criar um ChannelFactory, que, por sua vez, cria uma pilha de canais e retorna uma referência ao canal superior na pilha. Em seguida, o aplicativo pode usar esse canal para enviar mensagens. Para obter mais informações, veja Programação de nível de canal do cliente.

No lado de recebimento, uma associação é usada para criar um IChannelListener, que escuta mensagens de entrada. O IChannelListener fornece mensagens para o aplicativo de escuta criando pilhas de canal e entregando a referência do aplicativo ao canal superior. Em seguida, o aplicativo usa esse canal para receber mensagens de entrada. Para obter mais informações, veja Programação de nível de canal do serviço.

O modelo de objeto de canal

O modelo de objeto de canal é o conjunto principal de interfaces necessárias para implementar canais, ouvintes de canal e fábricas de canal. Também há algumas classes base fornecidas para ajudar em implementações personalizadas.

Os ouvintes de canal são responsáveis por ouvir mensagens de entrada e, em seguida, entregá-las à camada acima por meio de canais criados pelo ouvinte do canal.

As fábricas de canais são responsáveis por criar canais que são usados para enviar mensagens e para fechar todos os canais criados quando a fábrica de canais é fechada.

ICommunicationObject é a interface principal que define o computador de estado básico que todos os objetos de comunicação implementam. O CommunicationObject fornece uma implementação dessa interface principal da qual outras classes de canal podem derivar em vez de reimplementar a interface. No entanto, isso não é necessário: um canal personalizado pode implementar ICommunicationObject diretamente e não herdar de CommunicationObject. Nenhuma das classes na Figura 3 é considerada parte do modelo de canal; eles são auxiliares disponíveis para implementadores de canais personalizados que desejam criar canais.

Channel model

Os tópicos a seguir descrevem o modelo de objeto de canal, bem como várias áreas de desenvolvimento que ajudam a criar canais personalizados.

Tópico Descrição
Serviço: ouvintes de canais e canais Descreve os ouvintes de canal, que escutam canais de entrada em um aplicativo de serviço.
Cliente: fábricas de canais e canais Descreve as fábricas de canais, que criam canais para se conectar a um aplicativo de serviço.
Noções básicas de alterações de estado Descreve como o estado dos modelos de interface System.ServiceModel.ICommunicationObject muda nos canais.
Escolhendo um padrão de troca de mensagens Descreve os seis padrões básicos de troca de mensagens aos quais os canais podem dar suporte.
Lidando com exceções e falhas Descreve como lidar com falhas e exceções em canais personalizados.
Configuração e suporte de metadados Descreve como dar suporte ao uso de canais personalizados do modelo de aplicativo e como exportar e importar metadados usando associações e elementos de associação.