Despachante de canal personalizado
O exemplo CustomChannelDispatcher demonstra como criar a pilha de canais de forma personalizada implementando ServiceHostBase diretamente e como criar um dispatcher de canal personalizado no ambiente de host da Web. O distribuidor de canal interage com IChannelListener para aceitar canais e recupera mensagens da pilha de canais. Este exemplo também fornece um exemplo básico para mostrar como criar uma pilha de canais em um ambiente de host da Web usando VirtualPathExtensiono .
ServiceHostBase personalizada
Este exemplo implementa o tipo ServiceHostBase base em vez de demonstrar como substituir a implementação de pilha do ServiceHost Windows Communication Foundation (WCF) por uma camada de manipulação de mensagens personalizada na parte superior da pilha de canais. Você substitui o método InitializeRuntime virtual para criar ouvintes de canal e o dispatcher de canal.
Para implementar um serviço hospedado na Web, obtenha a extensão VirtualPathExtension de serviço da Extensions coleção e adicione-a BindingParameterCollection à para que a camada de transporte saiba como configurar o ouvinte de canal com base nas configurações do ambiente de hospedagem, ou seja, as configurações do IIS (Serviços de Informações da Internet)/Serviço de Ativação de Processos do Windows (WAS).
Despachante de canal personalizado
O dispatcher de canal personalizado estende o tipo ChannelDispatcherBase. Este tipo implementa a lógica de programação de camada de canal. Neste exemplo, apenas IReplyChannel é suportado para o padrão de troca de mensagens de solicitação-resposta, mas o dispatcher de canal personalizado pode ser facilmente estendido a outros tipos de canal.
O dispatcher primeiro abre o ouvinte do canal e, em seguida, aceita o canal de resposta singleton. Com o canal, ele começa a enviar mensagens (solicitações) em um loop infinito. Para cada solicitação, ele cria uma mensagem de resposta e a envia de volta ao cliente.
Criando uma mensagem de resposta
O processamento de mensagens é implementado no tipo MyServiceManager
. HandleRequest
No método, o Action
cabeçalho da mensagem é primeiro verificado para ver se a solicitação é suportada. Uma ação http://tempuri.org/HelloWorld/Hello
SOAP predefinida é definida para fornecer filtragem de mensagens. Isso é semelhante ao conceito de contrato de serviço na implementação WCF do ServiceHost.
Para o caso de ação SOAP correto, o exemplo recupera os dados da mensagem solicitada e gera uma resposta correspondente à solicitação semelhante à que é vista no ServiceHost caso.
Você lidou especialmente com o verbo HTTP-GET retornando uma mensagem HTML personalizada, neste caso, para que você possa navegar no serviço a partir de um navegador para ver se ele está compilado corretamente. Se a ação SOAP não corresponder, envie uma mensagem de falha de volta para indicar que a solicitação não é suportada.
O cliente deste exemplo é um cliente WCF normal que não assume nada do serviço. Assim, o serviço é especialmente projetado para corresponder ao que você obtém de uma implementação WCFServiceHost normal. Como resultado, apenas um contrato de serviço é exigido ao cliente.
Usando a amostra
A execução do aplicativo cliente produz diretamente a seguinte saída.
Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5
Você também pode navegar no serviço a partir de um navegador para que uma mensagem HTTP-GET seja processada no servidor. Isso faz com que você recupere o texto HTML bem formatado.