SessionMode Enumeração
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Especifica os valores disponíveis para indicar o suporte a sessões fiáveis que um contrato exige ou apoia.
public enum class SessionMode
public enum SessionMode
type SessionMode =
Public Enum SessionMode
- Herança
Campos
| Name | Valor | Description |
|---|---|---|
| Allowed | 0 | Especifica que o contrato suporta sessões se a vinculação recebida as suportar. |
| Required | 1 | Especifica que o contrato exige uma obrigação de sessão. É lançada uma exceção se a ligação não estiver configurada para suportar sessão. |
| NotAllowed | 2 | Especifica que o contrato nunca suporta vinculações que iniciem sessões. |
Exemplos
O exemplo de código seguinte mostra como usar a SessionMode propriedade de para ServiceContractAttribute especificar que o IMyService contrato de serviço requer vinculações que suportem o estado da sessão.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name = "SampleDuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract),
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract(IsOneWay = true)]
void Hello(string greeting);
}
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)]
void Reply(string responseToGreeting);
}
[ServiceBehaviorAttribute(InstanceContextMode=InstanceContextMode.PerSession)]
public class DuplexHello : IDuplexHello
{
public DuplexHello()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~DuplexHello()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
// Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000);
IHelloCallbackContract callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
}
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading
Namespace Microsoft.WCF.Documentation
<ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
Public Interface IDuplexHello
<OperationContract(IsOneWay:=True)> _
Sub Hello(ByVal greeting As String)
End Interface
Public Interface IHelloCallbackContract
<OperationContract(IsOneWay := True)> _
Sub Reply(ByVal responseToGreeting As String)
End Interface
<ServiceBehaviorAttribute(InstanceContextMode:=InstanceContextMode.PerSession)> _
Public Class DuplexHello
Implements IDuplexHello
Public Sub New()
Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
End Sub
Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
Console.WriteLine("Caller sent: " & greeting)
Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
Console.WriteLine("Waiting two seconds before returning call.")
' Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000)
Dim callerProxy As IHelloCallbackContract = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
Console.WriteLine("Sending back: " & response)
callerProxy.Reply(response)
End Sub
End Class
End Namespace
Observações
Use a SessionMode enumeração com a ServiceContractAttribute.SessionMode propriedade para exigir, permitir ou proibir que as ligações usem sessões entre endpoints que se conectem ou suportem o contrato de serviço. Uma sessão é uma forma de correlacionar um conjunto de mensagens trocadas entre dois ou mais pontos finais. Para obter mais informações sobre sessões, consulte Usando sessões.
Se o seu serviço suportar sessões, pode então usar a ServiceBehaviorAttribute.InstanceContextMode propriedade para especificar a relação entre as instâncias da implementação do seu contrato de serviço e a sessão do canal.
Por exemplo, se a ServiceContractAttribute.SessionMode propriedade estiver definida como Allowed e a ServiceBehaviorAttribute.InstanceContextMode propriedade estiver definida como InstanceContextMode.PerSession, um cliente pode usar uma ligação que suporta sessões fiáveis para fazer chamadas repetidas ao mesmo objeto de serviço.
Como uma sessão é um conceito ao nível do canal que o modelo de aplicação utiliza, existe uma interação entre a SessionMode enumeração num contrato e a ServiceBehaviorAttribute.InstanceContextMode propriedade, que controla a associação entre canais e objetos de serviço específicos.
A tabela seguinte mostra o resultado de um canal recebido que suporta ou não sessões fiáveis, dada a combinação ServiceContractAttribute.SessionMode do valor da propriedade e ServiceBehaviorAttribute.InstanceContextMode da propriedade do serviço.
| Valor ModoContextoInstância | Obrigatório | Permitido | Não permitido |
|---|---|---|---|
| PerCall | - Comportamento com canal com sessão: Uma sessão e System.ServiceModel.InstanceContext para cada chamada. - Comportamento com canal sem sessão: Uma exceção é lançada. |
- Comportamento com canal com sessão: Uma sessão e System.ServiceModel.InstanceContext para cada chamada. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada chamada. |
- Comportamento com canal de sessão: Uma exceção é lançada. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada chamada. |
| PerSession | - Comportamento com o canal sessionful: Uma sessão e System.ServiceModel.InstanceContext para cada canal. - Comportamento com canal sem sessão: Uma exceção é lançada. |
- Comportamento com o canal sessionful: Uma sessão e System.ServiceModel.InstanceContext para cada canal. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada chamada. |
- Comportamento com canal de sessão: Uma exceção é lançada. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada chamada. |
| Solteiro | - Comportamento com canal de sessão: Uma sessão e uma System.ServiceModel.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 System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton especificado pelo utilizador. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton definido pelo utilizador. |
- Comportamento com canal de sessão: Uma exceção é lançada. - Comportamento com canal sem sessão: Um System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton definido pelo utilizador. |