Headers vs. Properties


Quando escrevemos serviços WCF tanto do lado do cliente quanto do lado serviço, temos a disposição uma classe chamada OperationContext que, como o próprio nome diz, fornece acesso ao contexto da requisição atual através de uma propriedade estática chamada Current.

A partir desta propriedade podemos manipular a coleção de headers e properties (IncomingMessageHeaders, IncomingMessageProperties, OutgoingMessageHeaders e OutgoingMessageProperties) de entrada e saída. Cada uma dessas coleções tem finalidades diferentes. Os headers existentes em uma mensagem estão associados com o corpo da mesma e influenciarão no processamento dela, já que podem armazenar informações de correlação, transações, segurança, mensagens confiáveis, etc., tudo de acordo com as especificações WS-*, ou seja, esses headers são utilizados pela própria infraestrutura do WCF e ultrapassam possíveis intermediários, chegando até o seu destino final.

Já as properties são utilizadas “localmente”, não ultrapassando esses intermediários. O próprio WCF já utiliza isso em alguns casos como, por exemplo, nos protocolos existentes e suportados por ele. Caso o transporte seja realizado através do protocolo HTTP, os detalhes específicos da requisição/protocolo (HTTP Headers) são armazenados na coleção de properties, “fora” da mensagem. Se efetuarmos o tracing, podemos ver o seguinte resultado:

<MessageLogTraceRecord>
  <HttpRequest>
    <Method>POST</Method>
    <QueryString></QueryString>
    <WebHeaders>
      <AlgumaChave>AlgumValor</AlgumaChave>
      <SOAPAction>http://www.projetando.net/IUsuario/Adicionar</SOAPAction&gt;
      <Connection>Keep-Alive</Connection>
      <Content-Length>411</Content-Length>
      <Content-Type>text/xml; charset=utf-8</Content-Type>
      <Expect>100-continue</Expect>
      <Host>projetando.net</Host>
    </WebHeaders>
  </HttpRequest>
  <s:Envelope>
    <s:Header>
      <ActivityId>6269eb97-955f-4e4c-8477-e6379127de2f</ActivityId>
      <To>http://www.projetando.net/usuarios</To&gt;
      <Action>http://www.projetando.net/IUsuario/Adicionar</Action&gt;
    </s:Header>

    <s:Body>
      <Adicionar xmlns=”http://www.projetando.net“>
        <nome>Israel</nome>
        <email>israel@projetando.net</email>
      </Adicionar>
    </s:Body>
  </s:Envelope>
</MessageLogTraceRecord>

O que temos em vermelho são as properties relacionadas ao protocolo HTTP, mais precisamente aos HTTP Headers. Note que o elemento em negrito trata-se de um valor customizado que foi adicionado a esta coleção. O conteúdo em azul são os headers referentes a mensagem.

Anúncios

2 comentários sobre “Headers vs. Properties

  1. Boas Ricardo,

    Lembre-se de que as Properties não ultrapassam os limites do cliente/serviço. Neste caso, você pode optar pelo Header. Um outro detalhe é que se você já está dentro do método BeforeSendRequest, então o parâmetro "request" se refere a Message que será enviada para o serviço. Com isso, você pode fazer algo como:

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
    request.Headers.Add(MessageHeader.CreateHeader("Teste", "", "Via Header"));
    return null;
    }

    Do lado do serviço, você captura essas informações a partir da propriedade IncomingMessageHeaders da classe OperationContext.

    • Viva,

      Estou a usar um IClientMessageInspector para injectar uma propriedade numa mensagem:
      public object BeforeSendRequest(ref Message request, IClientChannel channel)
      {
      request.Properties [ "Um" ] = "1"; //nao funciona

      using (new OperationContextScope(channel))
      {
      OperationContext.Current.OutgoingMessageProperties["Um"] = "1"; //tambem nao
      }

      return (null);
      }

      No meu serviço, quando tento aceder a OperationContext.Current.RequestContext.RequestMessage.Properties["Um"], obtenho sempre null! O que poderá ser?

      Obrigado!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s