none
wcf / mantendo estado RRS feed

  • Pergunta

  •  Estamos iniciando o desenvolvimento de uma aplicação que será acessada via asp.net e windows forms.
    Nossa dúvida está em como mantaer estado de objetos ou valores que pecisemos usar ,e esses valores ficarem compartilhados entre os vários serviços (dentro da seção) exatametne como na seção do asp.net. Outra preocupaçào é se existe algum cache para guardarmos informações da aplicação.
    Vimos que existe a opção de usar o Binding Per-Session, mas também vimos que isso não é recomendado, o que você acha disso?  Realmente não é recomendável?  por exemplo em asp.net após o usuário se autenticar guardavamos as informaçòes dlee na seção e sempre um web services era chamado já sabíamos se estava autenticado, e as informaçòes (por exemplo permissòes)  do usuário estavam ali na seção, mas para isso toda chamada dos Serviços teria que ser per-session, isso prejudicaria muito a performance/escalabilidade?
    sexta-feira, 12 de março de 2010 14:41

Respostas

  • Boas Luciano,

    É importante dizer que a Session do WCF é uma coisa e a Session do ASP.NET é outra. Quando falamos em sessão no WCF, a idéia é manter a classe que representa o serviço ativa enquanto exibir a instância do proxy correspondente, e qualquer dado que essa classe mantenha, será mantido entre as várias requisições. Já a sessão do ASP.NET é a capacidade que temos de armazenar informações através de um dicionário de dados, que estará disponível enquanto o usuário estiver acessando a aplicação.

    Você pode combinar as duas coisas, por exemplo, mantendo as informações de estado dentro das variáveis de sessão do ASP.NET, e talvez não utilizar o modelo PerSession, mas o PerCall. Por mais que você diminua o overhead ao trocar PerSession por PerCall, o problema de escalabilidade ainda pode existir se você as variáveis de sessão do ASP.NET. Além disso, outro problema que pode ter é a afinidade que terá com o protocolo HTTP, obrigando você a somente expor o serviço através dele. Muitas vezes o que você precisa é manter o teu serviço independente de protocolo, pois dentro da empresa você quer utilizar TCP para performance, e via HTTP para interoperabilidade e comunicação com parceiros que estão além da sua rede.

    Este artigo poderá dar mais detalhes técnicos: http://www.israelaece.com/post/ASPNET-Session-em-servicos-WCF.aspx
    http://www.israelaece.com
    sexta-feira, 12 de março de 2010 15:13
    Moderador
  • Boas Luciano,

    Se você quer compartilhar informações entre serviços/usuários, então você tem algumas alternativas, como por exemplo, o banco de dados ou até mesmo variavéis estáticas.

    Quando você utilizar PerSession, todas as informações armazenadas dentro dele são visíveis somente para aquela instância do proxy correspondente, e qualquer alteração nela não refletirá para as outras instâncias.
    http://www.israelaece.com
    sexta-feira, 12 de março de 2010 17:58
    Moderador

Todas as Respostas

  • Boas Luciano,

    É importante dizer que a Session do WCF é uma coisa e a Session do ASP.NET é outra. Quando falamos em sessão no WCF, a idéia é manter a classe que representa o serviço ativa enquanto exibir a instância do proxy correspondente, e qualquer dado que essa classe mantenha, será mantido entre as várias requisições. Já a sessão do ASP.NET é a capacidade que temos de armazenar informações através de um dicionário de dados, que estará disponível enquanto o usuário estiver acessando a aplicação.

    Você pode combinar as duas coisas, por exemplo, mantendo as informações de estado dentro das variáveis de sessão do ASP.NET, e talvez não utilizar o modelo PerSession, mas o PerCall. Por mais que você diminua o overhead ao trocar PerSession por PerCall, o problema de escalabilidade ainda pode existir se você as variáveis de sessão do ASP.NET. Além disso, outro problema que pode ter é a afinidade que terá com o protocolo HTTP, obrigando você a somente expor o serviço através dele. Muitas vezes o que você precisa é manter o teu serviço independente de protocolo, pois dentro da empresa você quer utilizar TCP para performance, e via HTTP para interoperabilidade e comunicação com parceiros que estão além da sua rede.

    Este artigo poderá dar mais detalhes técnicos: http://www.israelaece.com/post/ASPNET-Session-em-servicos-WCF.aspx
    http://www.israelaece.com
    sexta-feira, 12 de março de 2010 15:13
    Moderador
  • Obrigado pela resposta Israel.
    via possibilidade de usar o asp.net , e até testamos, mas nós queremos fazer com você disse, queremos ficar independente de protocolo. Sendo assim utilizar a compatibilidade do asp.net realmente não nos atende.

    O que você sugere ? como gravarmos , por exemplo (basico)  os itens já selecionados pelo usuário em um site de compras? Mas de forma que outro serviço consiga acessar essa lista.  Mesmo quando utilizo o perSession os valores que armazeno são acessiveis apenas para aquele serviço específico, correto? como compartilhar?
    sexta-feira, 12 de março de 2010 15:58
  • Boas Luciano,

    Se você quer compartilhar informações entre serviços/usuários, então você tem algumas alternativas, como por exemplo, o banco de dados ou até mesmo variavéis estáticas.

    Quando você utilizar PerSession, todas as informações armazenadas dentro dele são visíveis somente para aquela instância do proxy correspondente, e qualquer alteração nela não refletirá para as outras instâncias.
    http://www.israelaece.com
    sexta-feira, 12 de março de 2010 17:58
    Moderador