Estendendo 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 de mensagens de tempo de execução do cliente equivalente, 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 dispatchers de canal e endpoint (ChannelDispatcher e EndpointDispatcher, respectivamente) são os componentes de serviço responsáveis por aceitar novos canais, receber mensagens, despacho e invocação de operações e processamento de 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 despachante de ponto de extremidade tem um DispatchRuntime que roteia mensagens para o apropriado DispatchOperation, 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.
Despachantes de canal
Um ChannelDispatcher objeto é criado para associar um IChannelListener em um determinado URI (chamado de 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 ouvir URI. 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 DispatchRuntime classes e DispatchOperation – que você 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 DispatchOperation classe permite que os usuários intercetem e estendam o dispatcher em um escopo de operação (ou seja, para todas as mensagens em uma 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 usuários podem inspecionar e registrar alguns conjuntos de mensagens de aplicativos que fluem através de um ponto de extremidade. Isso também pode ser feito com as interfaces do intercetador 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 feito, novamente, com as interfaces do intercetador 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 Seletor.
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 Seletor.
Pool 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 tempo 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 usuários podem implementar o controle de acesso personalizado estendendo as partes de tempo de execução Contrato ou Operação e adicionando 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, ver Como: Bloquear pontos de extremidade na empresa.)
Usando a classe DispatchRuntime
Use a DispatchRuntime classe para modificar o comportamento padrão de um serviço ou ponto de extremidade individual, ou para inserir objetos que implementam modificações personalizadas para 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 que você intercete e estenda o canal ou o despachante de ponto de extremidade para todas as mensagens em um 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 pelo UnhandledDispatchOperation imóvel. 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:
Os componentes de canal usam as propriedades do DispatchRuntime e as do dispatcher de canal associado retornadas pela ChannelDispatcher propriedade para personalizar como o channel dispatcher aceita e fecha canais. Esta categoria inclui as ChannelInitializers propriedades e InputSessionShutdownHandlers .
Os componentes da mensagem são personalizados para cada mensagem processada. Esta categoria inclui o MessageInspectors, OperationSelector, Operations, e as ErrorHandlers propriedades.
Os componentes de instância personalizam a criação, o tempo de vida e a eliminação de instâncias do tipo de serviço. Para obter mais informações sobre o tempo de vida do objeto de serviço, consulte a InstanceContextMode propriedade. Esta categoria inclui as InstanceContextInitializers e as InstanceProvider propriedades.
Os componentes relacionados à segurança podem usar as seguintes propriedades:
SecurityAuditLogLocation Indica onde os eventos de auditoria são gravados.
ImpersonateCallerForAllOperations Controla se o serviço tenta representar usando as credenciais fornecidas pela mensagem de entrada.
MessageAuthenticationAuditLevel Controla se os eventos de autenticação de mensagem bem-sucedida são gravados no log de eventos especificado pelo SecurityAuditLogLocation.
PrincipalPermissionMode Controla como a CurrentPrincipal propriedade é definida.
ServiceAuthorizationAuditLevel Especifica como a auditoria de eventos de autorização é executada.
SuppressAuditFailure Especifica se as exceções não críticas que ocorrem durante o processo de registro em log devem ser suprimidas.
Normalmente, os objetos de extensão personalizados são atribuídos a uma DispatchRuntime propriedade ou inseridos em uma coleção por um comportamento de serviço (um objeto que implementa ), um comportamento de IServiceBehaviorcontrato (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 têm um DispatchRuntime objeto que pode ser acessado usando a CallbackDispatchRuntime propriedade.
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 têm como escopo apenas uma operação de serviço. (Para modificar o comportamento em tempo de execução do serviço para todas as mensagens em 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 do tempo de execução no nível da operação:
As Actionpropriedades , ReplyAction, FaultContractInfos, IsOneWay, IsTerminating, e obtêm Name os respetivos valores para a operação.
O e TransactionRequired especificar o TransactionAutoComplete comportamento da transação.
As ReleaseInstanceBeforeCall propriedades e ReleaseInstanceAfterCall controlam o tempo de vida do objeto de serviço definido pelo usuário em relação ao InstanceContext.
O DeserializeRequest, SerializeReplye as Formatter propriedades permitem o controle explícito sobre a conversão de mensagens em objetos e objetos em mensagens.
A Impersonation propriedade especifica o nível de representação da operação.
A CallContextInitializers propriedade insere extensões de contexto de chamada personalizadas para a operação.
A AutoDisposeParameters propriedade controla quando objetos de parâmetro são destruídos.
A Invoker propriedade para inserir um objeto invocador personalizado.
A ParameterInspectors propriedade permite inserir um inspetor de parâmetros personalizado que pode ser usado para inspecionar ou modificar parâmetros e valores de retorno.