none
Sessão no WCF RRS feed

  • Pergunta

  • Prezados,

    Tenho procurado informações em como trabalhar como sessão no WCF, mas estou com algumas dificuldades.
    Tenho um componente que, dentre outras, gerencia conexão a banco de dados, o qual referencio a DLL no meu projeto WCF. Esse componente possui uma Interface de com métodos que controlam uma possível "Memória" da aplicação.

    Ou seja, se eu tenho uma aplicação Web, implemento esta interface usando o Session; se for Desktop uso um Module, por exemplo. Agora preciso implementar esta interface para o WCF e passar uma instância desse objeto para o componente.

    Como eu faço para usar "Sessions" (armazenar e recuperar valores) no WCF?

    Valeu!!
    quarta-feira, 20 de agosto de 2008 19:21

Respostas

  • Ola Danilo,

    Lembre-se de que serviços WCF são independentes de protocolo e a Session do ASP.NET tem afinidade com o HTTP. Para tentar exemplificar, veja o exemplo abaixo:

    Code Snippet

    //Contrato

    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IUsuario
    {
        [OperationContract]
        void Adicionar(string nome);


        [OperationContract]
        string[] RecuperarUsuarios();
    }

     

     

    Code Snippet

    //Implementação

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] //Default
    public class Usuarios : IUsuario
    {
        private List _usuarios = new List();

        public void Adicionar(string nome)
        {
            this._usuarios.Add(nome);
        }

        public string[] RecuperarUsuarios()
        {
            if (this._usuarios != null)
                return this._usuarios.ToArray();

            return null;
        }
    }

     


    Note que o membro interno _usuarios será mantido do lado do servidor automaticamente entre as mais diversas chamadas que você fizer por intermédio de um proxy. Como definir PerSession, cada instância do proxy terá um objeto a disposição no servidor e, neste caso, o membro _usuarios durará enquanto a instância do objeto durar que, por sua vez, é descartado quando o proxy foi também descartado. No cliente não muda nada:

    Code Snippet

    using (UsuarioClient proxy = new UsuarioClient())
    {
        proxy.Adicionar("Israel");
        proxy.Adicionar("Juliano");

        string[] usuarios = proxy.RecuperarUsuarios();
        Console.WriteLine("Total de Usuarios: " + usuarios.Length);


        string[] usuarios1 = proxy.RecuperarUsuarios();
        Console.WriteLine("Total de Usuarios: " + usuarios1.Length);
    }

     

     

    Utilizando PerSession, a própria classe é o "container" da informação. Você apenas precisa se preocupar quando tiver o InstanceContextMode definido como Single ou PerCall, pois ai precisará recorrer ao OperationContext.Current.SessionId para saber que é o usuário e assim, ir até o repositório recuperar ou inserir um novo item.

    quinta-feira, 21 de agosto de 2008 11:42
    Moderador

Todas as Respostas

  • Ola Danilo,

    Não sei se entendi corretamente o seu problema, mas a idéia é manter do lado do servidor informações durante os vários métodos (operações) que são invocados pelo cliente?

    Se sim, por padrão, o WCF trabalho em modo de Sessão, ou seja, uma vez criado o proxy do lado do cliente, enquanto durar o mesmo, dura a sessão do objeto do lado do servidor que atenderá as requisições para o mesmo. Isso é definido através da propriedade InstanceContextMode, definindo a mesma para PerSession (isso quer dizer "Per-Proxy").

    Para requerer que o serviço exija sessão, então pode definir a propriedade SessionMode (especificado no atributo ServiceContract) para Required, lembrando que você deve ser atentar ao binding, pois nem todos suportam sessão.

    quarta-feira, 20 de agosto de 2008 20:13
    Moderador
  • Israel,

    Valeu pela resposta.

    Bom, eu tinha lido sobre sessões no WCF em algumas páginas no MSDN (abaixo algumas delas).
    Já defini as diretivas nas classes. Todas as configurações já foram feitas para a utilização da Sessão.
    Estou usando o wsHttpBinding.

    No entanto, ainda estou na dúvida em como fazer para usar. Uma vez que eu não tenho como acessar o HttpSessionState, qual o objeto de contexto para gerenciar isso?

    Links:
    • http://msdn.microsoft.com/en-us/library/ms733040.aspx
    • http://msdn.microsoft.com/en-us/library/ms731193.aspx
    • http://msdn.microsoft.com/en-us/library/ms751429.aspx
    Valeu!!!
    quarta-feira, 20 de agosto de 2008 20:35
  • Ola Danilo,

    Lembre-se de que serviços WCF são independentes de protocolo e a Session do ASP.NET tem afinidade com o HTTP. Para tentar exemplificar, veja o exemplo abaixo:

    Code Snippet

    //Contrato

    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IUsuario
    {
        [OperationContract]
        void Adicionar(string nome);


        [OperationContract]
        string[] RecuperarUsuarios();
    }

     

     

    Code Snippet

    //Implementação

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] //Default
    public class Usuarios : IUsuario
    {
        private List _usuarios = new List();

        public void Adicionar(string nome)
        {
            this._usuarios.Add(nome);
        }

        public string[] RecuperarUsuarios()
        {
            if (this._usuarios != null)
                return this._usuarios.ToArray();

            return null;
        }
    }

     


    Note que o membro interno _usuarios será mantido do lado do servidor automaticamente entre as mais diversas chamadas que você fizer por intermédio de um proxy. Como definir PerSession, cada instância do proxy terá um objeto a disposição no servidor e, neste caso, o membro _usuarios durará enquanto a instância do objeto durar que, por sua vez, é descartado quando o proxy foi também descartado. No cliente não muda nada:

    Code Snippet

    using (UsuarioClient proxy = new UsuarioClient())
    {
        proxy.Adicionar("Israel");
        proxy.Adicionar("Juliano");

        string[] usuarios = proxy.RecuperarUsuarios();
        Console.WriteLine("Total de Usuarios: " + usuarios.Length);


        string[] usuarios1 = proxy.RecuperarUsuarios();
        Console.WriteLine("Total de Usuarios: " + usuarios1.Length);
    }

     

     

    Utilizando PerSession, a própria classe é o "container" da informação. Você apenas precisa se preocupar quando tiver o InstanceContextMode definido como Single ou PerCall, pois ai precisará recorrer ao OperationContext.Current.SessionId para saber que é o usuário e assim, ir até o repositório recuperar ou inserir um novo item.

    quinta-feira, 21 de agosto de 2008 11:42
    Moderador
  • Valeu Israel.

    Não estava entendendo como o objeto era mantido na "sessão".
    Agora ficou claro!

    Abraços,
    quinta-feira, 21 de agosto de 2008 17:37