SessionMode Enum

Definition

Anger de värden som är tillgängliga för att ange stöd för tillförlitliga sessioner som ett kontrakt kräver eller stöder.

public enum class SessionMode
public enum SessionMode
type SessionMode = 
Public Enum SessionMode
Arv
SessionMode

Fält

Name Värde Description
Allowed 0

Anger att kontraktet stöder sessioner om den inkommande bindningen stöder dem.

Required 1

Anger att kontraktet kräver en sessionskänslig bindning. Ett undantag utlöses om bindningen inte har konfigurerats för att stödja sessionen.

NotAllowed 2

Anger att kontraktet aldrig stöder bindningar som initierar sessioner.

Exempel

Följande kodexempel visar hur du använder SessionMode egenskapen ServiceContractAttribute för för att ange att tjänstkontraktet IMyService kräver bindningar som stöder sessionstillstånd.

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

Kommentarer

SessionMode Använd uppräkningen med ServiceContractAttribute.SessionMode egenskapen för att kräva, tillåta eller förbjuda bindningar för att använda sessioner mellan slutpunkter som ansluter till eller stöder tjänstkontraktet. En session är ett sätt att korrelera en uppsättning meddelanden som utbyts mellan två eller flera slutpunkter. Mer information om sessioner finns i Använda sessioner.

Om tjänsten stöder sessioner kan du sedan använda ServiceBehaviorAttribute.InstanceContextMode egenskapen för att ange relationen mellan instanser av din tjänstkontraktsimplementering och kanalsessionen.

Om ServiceContractAttribute.SessionMode egenskapen till exempel är inställd på Allowed och ServiceBehaviorAttribute.InstanceContextMode egenskapen är inställd på InstanceContextMode.PerSessionkan en klient använda en bindning som stöder tillförlitliga sessioner för att göra upprepade anrop till samma tjänstobjekt.

Eftersom en session är ett begrepp på kanalnivå som programmodellen använder, finns det en interaktion mellan SessionMode uppräkningen i ett kontrakt och ServiceBehaviorAttribute.InstanceContextMode egenskapen, som styr associationen mellan kanaler och specifika tjänstobjekt.

Följande tabell visar resultatet av en inkommande kanal som antingen stöder tillförlitliga sessioner eller inte stöder tillförlitliga sessioner med tanke på en tjänsts kombination av värdena för ServiceContractAttribute.SessionMode egenskapen och ServiceBehaviorAttribute.InstanceContextMode egenskapen.

InstanceContextMode-värde Obligatoriskt Tillåtet Ej Tillåtet
Per Anrop – Beteende med sessionsbunden kanal: En session och System.ServiceModel.InstanceContext för varje anrop.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionsbunden kanal: En session och System.ServiceModel.InstanceContext för varje anrop.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje anrop.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje anrop.
PerSession – Beteende med sessionskänslig kanal: En session och System.ServiceModel.InstanceContext för varje kanal.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionskänslig kanal: En session och System.ServiceModel.InstanceContext för varje kanal.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje anrop.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje anrop.
Single – Beteende med sessionskänslig kanal: En session och en System.ServiceModel.InstanceContext för alla anrop.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionskänslig kanal: En session och System.ServiceModel.InstanceContext för varje skapad singleton eller för den användardefinierade singletonen.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje skapad singleton eller för den användardefinierade singletonen.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En System.ServiceModel.InstanceContext för varje skapad singleton eller för den användardefinierade singletonen.

Gäller för