Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Em aplicativos do WCF (Windows Communication Foundation), uma sessão correlaciona um grupo de mensagens em uma conversa. As sessões do WCF são diferentes do objeto de sessão disponível em aplicativos ASP.NET, dão suporte a comportamentos diferentes e são controladas de maneiras diferentes. Este tópico descreve os recursos que as sessões habilitam em aplicativos WCF e como usá-los.
Sessões em aplicativos do Windows Communication Foundation
Quando um contrato de serviço especifica que ele requer uma sessão, esse contrato está especificando que todas as chamadas (ou seja, as trocas de mensagens subjacentes que dão suporte às chamadas) devem fazer parte da mesma conversa. Se um contrato especificar que ele permite sessões, mas não requer uma, os clientes podem se conectar e estabelecer uma sessão ou não estabelecer uma sessão. Se a sessão terminar e uma mensagem for enviada pelo mesmo canal, uma exceção será gerada.
As sessões do WCF têm os seguintes principais recursos conceituais:
Eles são iniciados e encerrados explicitamente pelo aplicativo de chamada (o cliente WCF).
As mensagens entregues durante uma sessão são processadas na ordem em que são recebidas.
As sessões correlacionam um grupo de mensagens em uma conversa. Diferentes tipos de correlação são possíveis. Por exemplo, um canal baseado em sessão pode correlacionar mensagens com base em uma conexão de rede compartilhada, enquanto outro canal baseado em sessão pode correlacionar mensagens com base em uma marca compartilhada no corpo da mensagem. As características que podem ser derivadas da sessão dependem da natureza da correlação.
Não há nenhum armazenamento de dados geral associado a uma sessão WCF.
Se você estiver familiarizado com a System.Web.SessionState.HttpSessionState classe em ASP.NET aplicativos e a funcionalidade que ela fornece, você poderá observar as seguintes diferenças entre esse tipo de sessão e sessões WCF:
ASP.NET sessões são sempre iniciadas pelo servidor.
ASP.NET sessões não são ordenadas implicitamente.
ASP.NET sessões fornecem um mecanismo geral de armazenamento de dados entre solicitações.
Este tópico descreve:
O comportamento de execução padrão ao usar associações baseadas em sessão na camada do modelo de serviço.
Os tipos de recursos que as associações fornecidas pelo sistema baseadas em sessão do WCF fornecem.
Como criar um contrato que declare um requisito de sessão.
Como entender e controlar a criação e o encerramento da sessão e a relação da sessão com a instância de serviço.
Comportamento de execução padrão usando sessões
Uma associação que tenta iniciar uma sessão é chamada de associação baseada em sessão . Os contratos de serviço especificam que eles exigem, permitem ou recusam associações baseadas em sessão definindo a propriedade ServiceContractAttribute.SessionMode na interface do contrato de serviço (ou classe) como um dos valores da enumeração System.ServiceModel.SessionMode. Por padrão, o valor dessa propriedade é Allowed, o que significa que, se um cliente usa uma associação baseada em sessão com uma implementação de serviço WCF, o serviço estabelece e usa a sessão fornecida.
Quando um serviço WCF aceita uma sessão de cliente, os seguintes recursos são habilitados por padrão:
Todas as chamadas entre um objeto cliente WCF são tratadas pela mesma instância de serviço.
Diferentes associações baseadas em sessão fornecem recursos adicionais.
Tipos de sessão System-Provided
Uma associação baseada em sessão dá suporte à associação padrão de uma instância de serviço com uma sessão específica. No entanto, associações diferentes baseadas em sessão dão suporte a recursos diferentes, além de habilitar o controle de instanciação baseado em sessão descrito anteriormente.
O WCF fornece os seguintes tipos de comportamento de aplicativo baseado em sessão:
O System.ServiceModel.Channels.SecurityBindingElement dá suporte às sessões baseadas em segurança, nas quais ambas as extremidades de comunicação concordaram com uma conversa segura específica. Para obter mais informações, consulte Segurança de Serviços. Por exemplo, a associação System.ServiceModel.WSHttpBinding , que contém suporte para sessões de segurança e sessões confiáveis, por padrão usa apenas uma sessão segura que criptografa e assina mensagens digitalmente.
A System.ServiceModel.NetTcpBinding associação dá suporte a sessões baseadas em TCP/IP para garantir que todas as mensagens sejam correlacionadas pela conexão no nível do soquete.
O System.ServiceModel.Channels.ReliableSessionBindingElement elemento, que implementa a especificação WS-ReliableMessaging, fornece suporte para sessões confiáveis nas quais as mensagens podem ser configuradas para serem entregues em ordem e exatamente uma vez, garantindo que as mensagens sejam recebidas mesmo quando as mensagens viajam entre vários nós durante a conversa. Para obter mais informações, consulte Reliable Sessions.
A associação System.ServiceModel.NetMsmqBinding fornece sessões de datagram MSMQ. Para obter mais informações, consulte Filas no WCF.
Definir a SessionMode propriedade não especifica o tipo de sessão que o contrato requer, apenas que ela requer uma.
Criando um contrato que requer uma sessão
A criação de um contrato que exige uma sessão indica que o grupo de operações que o contrato de serviço declara deve ser executado dentro da mesma sessão e que as mensagens devem ser entregues em ordem. Para afirmar o nível de suporte de sessão exigido por um contrato de serviço, defina a propriedade ServiceContractAttribute.SessionMode em sua interface ou classe de contrato de serviço como o valor da enumeração System.ServiceModel.SessionMode para especificar se o contrato:
Requer uma sessão.
Permite que um cliente estabeleça uma sessão.
Proíbe uma sessão.
A definição da SessionMode propriedade, no entanto, não especifica o tipo de comportamento baseado em sessão exigido pelo contrato. Ele instrui o WCF a confirmar em tempo de execução que a associação configurada (que cria o canal de comunicação) para o serviço faz, não faz ou pode estabelecer uma sessão ao implementar um serviço. Novamente, a vinculação pode atender a esse requisito por meio de qualquer tipo de comportamento baseado em sessão que escolher — seja segurança, transporte, confiabilidade ou alguma combinação destes. O comportamento exato depende do System.ServiceModel.SessionMode valor selecionado. Se a associação configurada do serviço não estiver em conformidade com o valor de SessionMode, uma exceção será gerada. As associações e os canais que eles criam que dão suporte às sessões são considerados baseados em sessão.
O contrato de serviço a seguir especifica que todas as operações no ICalculatorSession devem ser trocadas dentro de uma sessão. Nenhuma das operações retorna um valor para o chamador, exceto o Equals método. No entanto, o Equals método não usa parâmetros e, portanto, só pode retornar um valor diferente de zero dentro de uma sessão na qual os dados já foram passados para as outras operações. Esse contrato requer que uma sessão funcione corretamente. Sem uma sessão associada a um cliente específico, a instância de serviço não tem como saber quais dados anteriores esse cliente enviou.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
Se um serviço permitir uma sessão, uma sessão será estabelecida e usada se o cliente iniciar uma; caso contrário, nenhuma sessão será estabelecida.
Sessões e Instâncias de Serviço
Se você usar o comportamento de instanciação padrão no WCF, todas as chamadas entre um objeto cliente WCF serão tratadas pela mesma instância de serviço. Portanto, no nível do aplicativo, você pode pensar em uma sessão como habilitando o comportamento do aplicativo semelhante ao comportamento de chamada local. Por exemplo, quando você cria um objeto local:
Um construtor é chamado.
Todas as chamadas subsequentes feitas à referência de objeto do cliente WCF são processadas pela mesma instância de objeto.
Um destrutor é chamado quando a referência do objeto é destruída.
As sessões permitem um comportamento semelhante entre clientes e serviços, desde que o comportamento da instância de serviço padrão seja usado. Se um contrato de serviço exigir ou oferecer suporte a sessões, uma ou mais operações de contrato podem ser marcadas como iniciando ou encerrando uma sessão, definindo as propriedades IsInitiating e IsTerminating.
As operações de início são aquelas que devem ser chamadas como a primeira operação de uma nova sessão. As operações não iniciadas só podem ser chamadas depois que pelo menos uma operação de iniciação tiver sido chamada. Portanto, você pode criar um tipo de construtor de sessão para seu serviço declarando operações de início projetadas para obter a entrada de clientes apropriados para o início da instância de serviço. (O estado está associado à sessão, no entanto, e não ao objeto de serviço.)
As operações de encerramento, por outro lado, são aquelas que devem ser chamadas como a última mensagem em uma sessão existente. No caso padrão, o WCF recicla o objeto de serviço e seu contexto após a sessão com a qual o serviço foi associado é fechado. Portanto, você pode criar um tipo de destruidor declarando operações de encerramento projetadas para executar uma função apropriada ao final da instância de serviço.
Observação
Embora o comportamento padrão tenha uma semelhança com construtores e destruidores locais, é apenas uma semelhança. Qualquer operação de serviço do WCF pode ser uma operação de iniciação ou encerramento ou ambas ao mesmo tempo. Além disso, no caso padrão, iniciar operações pode ser chamado várias vezes em qualquer ordem; nenhuma sessão adicional é criada depois que a sessão é estabelecida e associada a uma instância, a menos que você controle explicitamente o tempo de vida da instância de serviço (manipulando o System.ServiceModel.InstanceContext objeto). Por fim, o estado está associado à sessão e não ao objeto de serviço.
Por exemplo, o ICalculatorSession contrato utilizado no exemplo anterior exige que o objeto cliente WCF primeiro execute a operação Clear antes de qualquer outra operação, e que a sessão com esse objeto cliente WCF seja encerrada quando executar a operação Equals. O exemplo de código a seguir mostra um contrato que impõe esses requisitos.
Clear deve ser chamado primeiro para iniciar uma sessão e essa sessão termina quando Equals é chamada.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
Os serviços não iniciam sessões com clientes. Em aplicativos cliente WCF, existe uma relação direta entre o tempo de vida do canal baseado em sessão e o tempo de vida da sessão em si. Dessa forma, os clientes criam novas sessões criando novos canais baseados em sessão e derrubam sessões existentes fechando canais baseados em sessão normalmente. Um cliente inicia uma sessão com um endpoint de serviço chamando um dos métodos a seguir:
ICommunicationObject.Open no canal retornado por uma chamada para ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Open no objeto cliente do WCF gerado pela ferramenta ServiceModel Metadata Utility Tool (Svcutil.exe).
Uma operação de iniciação em qualquer tipo de objeto cliente WCF (por padrão, todas as operações estão sendo iniciadas). Quando a primeira operação é chamada, o objeto cliente WCF abre automaticamente o canal e inicia uma sessão.
Normalmente, um cliente encerra uma sessão com um endpoint de serviço chamando um dos seguintes:
ICommunicationObject.Close no canal retornado por uma chamada para ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close no objeto cliente WCF gerado por Svcutil.exe.
Uma operação de encerramento em qualquer tipo de objeto cliente WCF (por padrão, nenhuma operação está sendo encerrada; o contrato deve especificar explicitamente uma operação de encerramento). Quando a primeira operação é chamada, o objeto cliente WCF abre automaticamente o canal e inicia uma sessão.
Para obter exemplos, consulte Como criar um serviço que requer sessões , bem como os exemplos padrão de comportamento de serviço e instanciação .
Para obter mais informações sobre clientes e sessões, consulte Acessando serviços usando um cliente WCF.
Sessões interagem com configurações de InstanceContext
Há uma interação entre a SessionMode enumeração em um contrato e a ServiceBehaviorAttribute.InstanceContextMode propriedade, que controla a associação entre canais e objetos de serviço específicos. Para obter mais informações, consulte Sessões, Instanciação e Simultaneidade.
Compartilhando objetos InstanceContext
Você também pode controlar qual canal ou chamada baseada em sessão está associada a qual InstanceContext objeto executando essa associação você mesmo.
Sessões e streaming
Quando você tem uma grande quantidade de dados para transferir, o modo de transferência de streaming no WCF é uma alternativa viável ao comportamento padrão de buffer e processamento de mensagens na memória em sua totalidade. Você pode obter um comportamento inesperado ao transmitir chamadas com uma associação baseada em sessão. Todas as chamadas de streaming são feitas por meio de um único canal (o canal de datagram) que não dá suporte a sessões, mesmo que a associação que está sendo usada esteja configurada para usar sessões. Se vários clientes fizerem chamadas de streaming para o mesmo objeto de serviço em uma associação baseada em sessão, e o modo de simultaneidade do objeto de serviço estiver definido como único e seu modo de contexto de instância estiver definido como PerSession, todas as chamadas deverão passar pelo canal de datagram e, portanto, apenas uma chamada será processada por vez. Portanto, um ou mais clientes podem atingir o tempo limite. Você pode contornar esse problema definindo o InstanceContextMode do objeto de serviço como PerCall ou a Simultaneidade como Múltipla.
Observação
MaxConcurrentSessions não tem efeito nesse caso porque há apenas uma "sessão" disponível.