Partilhar via


Ampliando despachantes

Os despachantes são responsáveis por retirar as mensagens recebidas dos canais subjacentes, traduzi-las em invocações de método no código do aplicativo e enviar os resultados de volta para o chamador. As extensões do dispatcher permitem modificar esse processamento. Você pode implementar inspetores de mensagens ou parâmetros que inspecionam ou modificam o conteúdo de mensagens ou parâmetros. Você pode alterar a maneira como as mensagens são roteadas para operações ou fornecer alguma outra funcionalidade.

Este tópico descreve como usar as DispatchRuntime classes e DispatchOperation em um aplicativo de serviço WCF (Windows Communication Foundation) para modificar o comportamento de execução padrão de um dispatcher ou para intercetar ou modificar mensagens, parâmetros ou valores de retorno antes ou depois de enviá-los ou recuperá-los da camada de canal. Para obter mais informações sobre o processamento equivalente de mensagens de tempo de execução do cliente, consulte Estendendo Clientes. Para entender a função que IExtensibleObject<T> os tipos desempenham no acesso ao estado compartilhado entre vários objetos de personalização de tempo de execução, consulte Objetos extensíveis.

Despachantes

A camada de modelo de serviço executa a conversão entre o modelo de programação do desenvolvedor e a troca de mensagens subjacente, comumente chamada de camada de canal. No WCF, os despachantes de canal e de endpoint (ChannelDispatcher e EndpointDispatcher, respectivamente) são os componentes do serviço responsáveis por aceitar novos canais, receber mensagens, enviar e invocar operações, e processar respostas. Os objetos do dispatcher são objetos do recetor, mas as implementações de contrato de retorno de chamada em serviços duplex também expõem seus objetos do dispatcher para inspeção, modificação ou extensão.

O distribuidor de canal (e acompanhante IChannelListener) extrai mensagens do canal subjacente e passa as mensagens para seus respetivos despachantes de ponto final. Cada controlador de ponto de extremidade tem um DispatchRuntime que encaminha mensagens para o DispatchOperation apropriado, que é responsável por chamar o método que implementa a operação. Várias classes de extensão opcionais e obrigatórias são invocadas ao longo do caminho. Este tópico explica como essas partes se encaixam e como você pode modificar propriedades e conectar seu próprio código para estender a funcionalidade base.

As propriedades do dispatcher e os objetos de personalização modificados são inseridos usando objetos de comportamento de serviço, ponto de extremidade, contrato ou operação. Este tópico não descreve como usar comportamentos. Para obter mais informações sobre os tipos usados para inserir modificações do dispatcher, consulte Configurando e estendendo o tempo de execução com comportamentos.

O gráfico a seguir fornece uma exibição de alto nível dos itens de arquitetura em um serviço.

A arquitetura de tempo de execução de despacho

Despachadores de Canal

Um objeto ChannelDispatcher é criado para associar um IChannelListener a um determinado URI (chamado URI de escuta) a uma instância de um serviço. Cada ServiceHost objeto pode ter muitos ChannelDispatcher objetos, cada um associado a apenas um ouvinte e um URI de escuta. Quando uma mensagem chega, o ChannelDispatcher consulta cada um dos objetos associados EndpointDispatcher se o ponto de extremidade pode aceitar a mensagem e passa a mensagem para aquele que pode.

Todas as propriedades que controlam o tempo de vida e o comportamento de uma sessão de canal estão disponíveis para inspeção ou modificação no ChannelDispatcher objeto. Isso inclui inicializadores de canal personalizados, o ouvinte do canal, o host, o associado InstanceContexte assim por diante.

Despachantes de ponto final

O EndpointDispatcher objeto é responsável por processar mensagens de um ChannelDispatcher quando o endereço de destino de uma mensagem corresponde ao AddressFilter e a ação da mensagem corresponde à ContractFilter propriedade. Se dois EndpointDispatcher objetos puderem aceitar uma mensagem, o valor da FilterPriority propriedade determinará o ponto de extremidade de prioridade mais alta.

Use o EndpointDispatcher para adquirir os dois principais pontos de extensão do modelo de serviço – as classes DispatchRuntime e DispatchOperation – que se pode usar para personalizar o processamento do dispatcher. A DispatchRuntime classe permite que os usuários intercetem e estendam o dispatcher no escopo do contrato (ou seja, para todas as mensagens em um contrato). A classe DispatchOperation permite que os utilizadores intercetem e expandam o dispatcher num âmbito de operação (ou seja, para todas as mensagens numa operação).

Cenários

Há uma série de razões para estender o despachante:

  • Validação de mensagem personalizada. Os usuários podem impor que uma mensagem é válida para um determinado esquema. Isso pode ser feito implementando as interfaces do intercetador de mensagens. Para obter um exemplo, consulte Inspetores de mensagens.

  • Registo de Mensagens Personalizado. Os utilizadores podem inspecionar e registar alguns conjuntos de mensagens de aplicações que fluem através de um endpoint. Isso também pode ser feito com as interfaces do intercetor de mensagens.

  • Transformações de mensagens personalizadas. Os usuários podem aplicar determinadas transformações à mensagem no tempo de execução (por exemplo, para controle de versão). Isso pode ser realizado, novamente, utilizando as interfaces do interceptor de mensagens.

  • Modelo de dados personalizado. Os usuários podem ter um modelo de serialização de dados diferente daqueles suportados por padrão no WCF (ou seja, System.Runtime.Serialization.DataContractSerializer, System.Xml.Serialization.XmlSerializere mensagens brutas). Isso pode ser feito implementando as interfaces do formatador de mensagens. Para obter um exemplo, consulte Operation Formatter e Operation Selector.

  • Validação de parâmetros personalizados. Os usuários podem impor que os parâmetros digitados são válidos (em oposição ao XML). Isso pode ser feito usando as interfaces do inspetor de parâmetros.

  • Despacho de Operação Personalizada. Os usuários podem implementar o despacho em algo diferente de ação – por exemplo, no elemento body ou em uma propriedade de mensagem personalizada. Isso pode ser feito usando a IDispatchOperationSelector interface. Para obter um exemplo, consulte Operation Formatter e Operation Selector.

  • Agrupamento de objetos. Os usuários podem agrupar instâncias em vez de alocar uma nova para cada chamada. Isso pode ser implementado usando as interfaces do provedor de instância. Para obter um exemplo, consulte Pooling.

  • Locação de instâncias. Os usuários podem implementar um padrão de leasing para o tempo de vida da instância, semelhante ao do .NET Framework Remoting. Isso pode ser feito usando as interfaces de ciclo de vida do contexto da instância.

  • Tratamento personalizado de erros. Os usuários podem controlar como os erros locais são processados e como as falhas são comunicadas de volta aos clientes. Isso pode ser implementado usando as IErrorHandler interfaces.

  • Comportamentos de autorização personalizados. Os utilizadores podem implementar controlo de acesso personalizado ao estender as componentes do tempo de execução do Contrato ou da Operação e ao adicionar verificações de segurança com base nos tokens presentes na mensagem. Isso pode ser feito usando as interfaces do intercetador de mensagens ou do intercetador de parâmetros. Para obter exemplos, consulte Extensibilidade de segurança.

    Atenção

    Como a alteração das propriedades de segurança tem o potencial de comprometer a segurança dos aplicativos WCF, é altamente recomendável que você realize modificações relacionadas à segurança com cuidado e teste completamente antes da implantação.

  • Validadores de tempo de execução WCF personalizados. Você pode instalar validadores personalizados que examinam serviços, contratos e associações para impor políticas de nível empresarial em relação a aplicativos WCF. (Por exemplo, consulte Como proteger endpoints na empresa.)

Usando a classe DispatchRuntime

Use a classe DispatchRuntime para modificar o comportamento padrão de um serviço ou endpoint individual, ou para inserir objetos que realizam modificações personalizadas em um ou ambos os seguintes processos de serviço (ou processos de cliente, no caso de um cliente duplex):

  • A transformação de mensagens de entrada em objetos e a liberação desses objetos como invocações de método em um objeto de serviço.

  • A transformação de objetos recebidos da resposta a uma invocação de operação de serviço em mensagens de saída.

O DispatchRuntime permite-lhe interceptar e estender o canal ou o despachante de endpoints para todas as mensagens num contrato específico, mesmo quando uma mensagem não é reconhecida. Quando chega uma mensagem que não corresponde a nenhuma declarada no contrato, ela é despachada para a operação devolvida pela propriedade UnhandledDispatchOperation. Para intercetar ou estender todas as mensagens de uma operação específica, consulte a DispatchOperation classe.

Existem quatro áreas principais de extensibilidade do despachante expostas pela DispatchRuntime classe:

  1. Os componentes de canal usam as propriedades do DispatchRuntime e as do distribuidor de canal associado retornadas pela propriedade ChannelDispatcher para personalizar o modo como o distribuidor de canal aceita e encerra canais. Esta categoria inclui as ChannelInitializers propriedades e InputSessionShutdownHandlers .

  2. Os componentes da mensagem são personalizados para cada mensagem processada. Esta categoria inclui o MessageInspectors, OperationSelector, Operations, e as ErrorHandlers propriedades.

  3. Os componentes de instância personalizam a criação, o tempo de vida e o descarte de instâncias do tipo de serviço. Para obter mais informações sobre o ciclo de vida dos objetos de serviço, consulte a propriedade InstanceContextMode. Esta categoria inclui as InstanceContextInitializers e as InstanceProvider propriedades.

  4. Os componentes relacionados à segurança podem usar as seguintes propriedades:

Normalmente, os objetos de extensão personalizados são atribuídos a uma propriedade DispatchRuntime ou inseridos numa coleção por um comportamento de serviço (um objeto que implementa IServiceBehavior), um comportamento de contrato (um objeto que implementa IContractBehavior) ou um comportamento de ponto de extremidade (um objeto que implementa IEndpointBehavior). Em seguida, o objeto de comportamento de instalação é adicionado à coleção apropriada de comportamentos programaticamente ou implementando um objeto personalizado BehaviorExtensionElement para permitir que o comportamento seja inserido usando um arquivo de configuração do aplicativo.

Os clientes duplex (clientes que implementam um contrato de retorno de chamada especificado por um serviço duplex) também possuem um objeto DispatchRuntime que pode ser acedido através da propriedade CallbackDispatchRuntime.

Usando a classe DispatchOperation

A DispatchOperation classe é o local para modificações em tempo de execução e o ponto de inserção para extensões personalizadas que são limitadas a uma única operação de serviço. (Para modificar o comportamento em tempo de execução do serviço para todas as mensagens de um contrato, use a DispatchRuntime classe.)

Instale DispatchOperation modificações usando um objeto de comportamento de serviço personalizado.

Use a Operations propriedade para localizar o DispatchOperation objeto que representa uma operação de serviço específica.

As seguintes propriedades controlam a execução durante o tempo de execução ao nível da operação:

Ver também