Eu tenho um serviço WCF hospedado em um serviço do Windows. Os clientes que usam esse serviço devem passar um identificador toda vez que estão chamando métodos de serviço (porque esse identificador é importante para o que o método chamado deve fazer). Eu pensei que era uma boa idéia colocar esse identificador de alguma forma nas informações do cabeçalho do WCF.
Se for uma boa ideia, como posso adicionar o identificador automaticamente às informações do cabeçalho. Em outras palavras, sempre que o usuário chama o método WCF, o identificador deve ser adicionado automaticamente ao cabeçalho.
ATUALIZAÇÃO: os clientes que estão usando o serviço WCF são aplicativos Windows e Windows Mobile (usando o Compact Framework).
Respostas:
A vantagem disso é que ele é aplicado a todas as chamadas.
Crie uma classe que implemente IClientMessageInspector . No método BeforeSendRequest, adicione seu cabeçalho personalizado à mensagem de saída. Pode ser algo como isto:
Em seguida, crie um comportamento do nó de extremidade que aplique o inspetor de mensagens ao tempo de execução do cliente. Você pode aplicar o comportamento por meio de um atributo ou via configuração usando um elemento de extensão de comportamento.
Aqui está um ótimo exemplo de como adicionar um cabeçalho de agente do usuário HTTP a todas as mensagens de solicitação. Estou usando isso em alguns de meus clientes. Você também pode fazer o mesmo no lado do serviço implementando o IDispatchMessageInspector .
É isso que você tinha em mente?
Atualização: Encontrei esta lista de recursos do WCF suportados pela estrutura compacta. Acredito que os inspetores de mensagens classificados como 'Extensibilidade do canal', que, de acordo com este post, sejam suportados pela estrutura compacta.
fonte
OutgoingMessageProperties
é o que você precisa para acessar os cabeçalhos HTTP - e não osOutgoingMessageHeaders
cabeçalhos SOAP.Você o adiciona à chamada usando:
E então, no lado do servidor, você o pega usando:
fonte
OperationContextScope
(eOperationContext
) sãoThreadStatic
- a resposta de Mark Good funcionará sem depender deThreadStatic
itens.Se você quiser adicionar o mesmo cabeçalho a todas as solicitações do serviço, poderá fazê-lo sem qualquer codificação!
Basta adicionar o nó de cabeçalhos com os cabeçalhos necessários no nó do nó de extremidade no arquivo de configuração do cliente
fonte
MessageHeader
) - não cabeçalhos HTTP.Aqui está outra solução útil para adicionar manualmente cabeçalhos HTTP personalizados à sua solicitação WCF do cliente usando o
ChannelFactory
proxy. Isso teria que ser feito para cada solicitação, mas é suficiente como uma demonstração simples se você só precisar testar seu proxy de unidade em preparação para plataformas que não sejam do .NET.fonte
Isso é semelhante à resposta do NimsDotNet, mas mostra como fazê-lo programaticamente.
Basta adicionar o cabeçalho à encadernação
fonte
fonte
Isso é o que funcionou para mim, adaptado de Adicionando cabeçalhos HTTP a chamadas WCF
Depois de declarar essas classes, você pode adicionar o novo comportamento ao seu cliente WCF assim:
fonte
Isso funciona para mim
fonte
As ligações de contexto no .NET 3.5 podem ser exatamente o que você está procurando. Existem três prontos para uso: BasicHttpContextBinding, NetTcpContextBinding e WSHttpContextBinding. O protocolo de contexto basicamente passa pares de valores-chave no cabeçalho da mensagem. Confira o artigo Gerenciando Estado com Serviços Duráveis na revista MSDN.
fonte
Se entendi corretamente sua exigência, a resposta simples é: você não pode.
Isso ocorre porque o cliente do serviço WCF pode ser gerado por terceiros que usam seu serviço.
Se você tiver controle dos clientes do seu serviço, poderá criar uma classe de cliente base que adicione o cabeçalho desejado e herda o comportamento nas classes de trabalho.
fonte
Você pode especificar cabeçalhos personalizados no MessageContract .
Você também pode usar os cabeçalhos <endpoint> armazenados no arquivo de configuração e serão copiados o tempo todo no cabeçalho de todas as mensagens enviadas pelo cliente / serviço. Isso é útil para adicionar algum cabeçalho estático facilmente.
fonte
MessageHeader
) - não cabeçalhos HTTP.Se você deseja adicionar cabeçalhos HTTP personalizados a todas as chamadas WCF de maneira orientada a objetos, não procure mais.
Assim como na resposta de Mark Good e paulwhit, precisamos subclasses
IClientMessageInspector
para injetar os cabeçalhos HTTP personalizados na solicitação do WCF. No entanto, vamos tornar o inspetor mais genérico, aceitando um dicionário contendo os cabeçalhos que queremos adicionar:Assim como na resposta de Mark Good e paulwhit, precisamos subclasses
IEndpointBehavior
para injetar nossaHttpHeaderMessageInspector
no nosso cliente WCF.A última parte necessária para concluir nossa abordagem orientada a objetos é criar uma subclasse de nosso cliente gerado automaticamente pelo WCF (usei o Guia de Referência de Serviços da Web WCF da Microsoft para gerar um cliente WCF).
No meu caso, preciso anexar uma chave de API ao diretório
x-api-key
cabeçalho HTML.A subclasse faz o seguinte:
EndpointConfiguration
enum foi gerado para passar para o construtor - talvez sua implementação não tenha isso)AddHttpHeaderMessageEndpointBehavior
aosEndpoint
comportamentos do clientePor fim, use seu cliente!
A solicitação HTTP resultante deve conter seus cabeçalhos HTTP e ter a seguinte aparência:
fonte
Um pouco atrasado para a festa, mas Juval Lowy aborda esse cenário exato em seu livro e na biblioteca ServiceModelEx associada .
Basicamente, ele define as especializações ClientBase e ChannelFactory que permitem especificar valores de cabeçalho seguros para tipos. Sugiro baixar o código-fonte e examinar as classes HeaderClientBase e HeaderChannelFactory.
John
fonte