Partilhar via


Sessões, Instância e Simultaneidade

Uma sessão é uma correlação de todas as mensagens enviadas entre dois pontos de extremidade. A instanciação refere-se ao controle do tempo de vida dos objetos de serviço definidos pelo usuário e seus objetos relacionados InstanceContext . Simultaneidade é o termo dado ao controle do número de threads executados em um InstanceContext ao mesmo tempo.

Este tópico descreve essas configurações, como usá-las e as várias interações entre elas.

Sessões

Quando um contrato de serviço define a ServiceContractAttribute.SessionMode propriedade como SessionMode.Required, esse contrato está dizendo que todas as chamadas (ou seja, as trocas de mensagens subjacentes que suportam as chamadas) devem fazer parte da mesma conversa. Se um contrato especificar que permite sessões, mas não requer uma, os clientes podem se conectar e estabelecer uma sessão ou não. Se a sessão terminar e uma mensagem for enviada pelo mesmo canal baseado em sessão, uma exceção será lançada.

As sessões WCF têm as seguintes características conceituais principais:

  • Eles são explicitamente iniciados e encerrados pelo aplicativo de chamada.

  • 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. O significado dessa correlação é uma abstração. 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 tag compartilhada no corpo da mensagem. Os recursos que podem ser derivados da sessão dependem da natureza da correlação.

  • Não há armazenamento de dados geral associado a uma sessão WCF.

Se você estiver familiarizado com a System.Web.SessionState.HttpSessionState classe em aplicativos ASP.NET e a funcionalidade que ela fornece, você pode notar 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 são implicitamente desordenadas.

  • ASP.NET sessões fornecem um mecanismo geral de armazenamento de dados entre solicitações.

Os aplicativos cliente e os aplicativos de serviço interagem com as sessões de maneiras diferentes. Os aplicativos cliente iniciam sessões e, em seguida, recebem e processam as mensagens enviadas dentro da sessão. Os aplicativos de serviço podem usar sessões como um ponto de extensibilidade para adicionar comportamento adicional. Isso é feito trabalhando diretamente com o provedor de contexto de instância personalizada ou implementando-o InstanceContext .

Instanciação

O comportamento de instanciação (definido usando a propriedade) controla ServiceBehaviorAttribute.InstanceContextMode como o InstanceContext é criado em resposta às mensagens recebidas. Por padrão, cada InstanceContext um é associado a um objeto de serviço definido pelo usuário, portanto, (no caso padrão), a InstanceContextMode configuração da propriedade também controla a instanciação de objetos de serviço definidos pelo usuário. A InstanceContextMode enumeração define os modos de instanciação.

Os seguintes modos de instanciação estão disponíveis:

  • PerCall: Um novo InstanceContext (e, portanto, objeto de serviço) é criado para cada solicitação do cliente.

  • PerSession: Um novo InstanceContext (e, portanto, um objeto de serviço) é criado para cada nova sessão de cliente e mantido durante o tempo de vida dessa sessão (isso requer uma associação que ofereça suporte a sessões).

  • Single: Um único InstanceContext (e, portanto, objeto de serviço) lida com todas as solicitações do cliente durante o tempo de vida do aplicativo.

O exemplo de código a seguir mostra o valor padrão InstanceContextMode , PerSession sendo explicitamente definido em uma classe de serviço.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
{
    ...  
}  

E enquanto a propriedade controla ServiceBehaviorAttribute.InstanceContextMode a frequência com que o InstanceContext é liberado, o e ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete properties controla OperationBehaviorAttribute.ReleaseInstanceMode quando o objeto de serviço é liberado.

Serviços Singleton bem conhecidos

Uma variação em objetos de serviço de instância única às vezes é útil: você mesmo pode criar um objeto de serviço e criar o host de serviço usando esse objeto. Para fazer isso, você também deve definir a ServiceBehaviorAttribute.InstanceContextMode propriedade como Single ou uma exceção é lançada quando o host de serviço é aberto.

Use o ServiceHost(Object, Uri[]) construtor para criar tal serviço. Ele fornece uma alternativa à implementação de um personalizado System.ServiceModel.Dispatcher.IInstanceContextInitializer quando você deseja fornecer uma instância de objeto específica para uso por um serviço singleton. Você pode usar essa sobrecarga quando o tipo de implementação de serviço é difícil de construir (por exemplo, se ele não implementar um construtor público sem parâmetros).

Observe que quando um objeto é fornecido a esse construtor, alguns recursos relacionados ao comportamento de instanciação do Windows Communication Foundation (WCF) funcionam de forma diferente. Por exemplo, a chamada InstanceContext.ReleaseServiceInstance não tem efeito quando uma instância de objeto singleton é fornecida. Da mesma forma, qualquer outro mecanismo de liberação de instância é ignorado. O ServiceHost sempre se comporta como se a OperationBehaviorAttribute.ReleaseInstanceMode propriedade estivesse definida para ReleaseInstanceMode.None todas as operações.

Compartilhando objetos InstanceContext

Você também pode controlar qual canal ou chamada de sessão está associada a qual InstanceContext objeto executando essa associação você mesmo.

Simultaneidade

Simultaneidade é o controle do número de threads ativos em um InstanceContext a qualquer momento. Isso é controlado usando o ServiceBehaviorAttribute.ConcurrencyMode com a ConcurrencyMode enumeração.

Os três modos de simultaneidade a seguir estão disponíveis:

  • Single: Cada contexto de instância tem permissão para ter no máximo uma mensagem de processamento de thread no contexto de instância de cada vez. Outros threads que desejam usar o mesmo contexto de instância devem bloquear até que o thread original saia do contexto de instância.

  • Multiple: Cada instância de serviço pode ter vários threads processando mensagens simultaneamente. A implementação do serviço deve ser thread-safe para usar esse modo de simultaneidade.

  • Reentrant: Cada instância de serviço processa uma mensagem de cada vez, mas aceita chamadas de operação de reentrada. O serviço só aceita essas chamadas quando está chamando por meio de um objeto de cliente WCF.

Nota

Compreender e desenvolver código que usa com segurança mais de um thread pode ser difícil de escrever com êxito. Antes de usar Multiple valores OR Reentrant , certifique-se de que seu serviço foi projetado corretamente para esses modos. Para obter mais informações, veja ConcurrencyMode.

O uso da simultaneidade está relacionado ao modo de instanciação. No PerCall instancing, a simultaneidade não é relevante, porque cada mensagem é processada por um novo InstanceContext e, portanto, nunca mais de um thread está ativo no InstanceContext.

O exemplo de código a seguir demonstra a configuração da ConcurrencyMode propriedade como Multiple.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
    ...  
}  

As sessões interagem com as configurações do InstanceContext

Sessões e InstanceContext interagem dependendo da combinação do valor da enumeração em um contrato e da ServiceBehaviorAttribute.InstanceContextMode propriedade na implementação do SessionMode serviço, que controla a associação entre canais e objetos de serviço específicos.

A tabela a seguir mostra o resultado de um canal de entrada suportando sessões ou não suportando sessões dada a combinação de um serviço dos valores da ServiceContractAttribute.SessionMode propriedade e da ServiceBehaviorAttribute.InstanceContextMode propriedade.

Valor InstanceContextMode Required Allowed NotAllowed
PerCall - Comportamento com canal de sessão: Uma sessão e InstanceContext para cada chamada.
- Comportamento com canal sem sessão: Uma exceção é lançada.
- Comportamento com canal de sessão: Uma sessão e InstanceContext para cada chamada.
- Comportamento com canal sem sessão: Um InstanceContext para cada chamada.
- Comportamento com canal de sessão: Uma exceção é lançada.
- Comportamento com canal sem sessão: Um InstanceContext para cada chamada.
PerSession - Comportamento com o canal sessionful: Uma sessão e InstanceContext para cada canal.
- Comportamento com canal sem sessão: Uma exceção é lançada.
- Comportamento com o canal sessionful: Uma sessão e InstanceContext para cada canal.
- Comportamento com canal sem sessão: Um InstanceContext para cada chamada.
- Comportamento com canal de sessão: Uma exceção é lançada.
- Comportamento com canal sem sessão: Um InstanceContext para cada chamada.
Única - Comportamento com canal de sessão: Uma sessão e uma InstanceContext para todas as chamadas.
- Comportamento com canal sem sessão: Uma exceção é lançada.
- Comportamento com canal de sessão: Uma sessão e InstanceContext para o singleton criado ou especificado pelo usuário.
- Comportamento com canal sem sessão: Um InstanceContext para o singleton criado ou especificado pelo usuário.
- Comportamento com canal de sessão: Uma exceção é lançada.
- Comportamento com canal sem sessão: Um InstanceContext para cada singleton criado ou para o singleton especificado pelo usuário.

Consulte também