How to: Create a Service That Requires Sessions


Sessions create a shared state between two or more endpoints that enables useful features such as callbacks, multi-hop security, and associations between clients and service instances. For more information about sessions in Windows Communication Foundation (WCF) applications, see Using Sessions.

To specify that a contract require its binding to support sessions

  1. Create a service contract with at least one operation. For an example of how to create a service contract, see How to: Define a Windows Communication Foundation Service Contract.

  2. Modify the System.ServiceModel.ServiceContractAttribute that declares the contract by setting the ServiceContractAttribute.SessionMode property to either:

  3. Configure your service endpoint to use a binding that supports sessions. The following configuration example shows the use of the System.ServiceModel.WSDualHttpBinding, which supports a WS-ReliableMessaging session.


The following example code shows how to specify a contract-level session requirement and use a configuration file to support that requirement with the System.ServiceModel.WSDualHttpBinding binding.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
    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);

  public class DuplexHello : IDuplexHello

    public DuplexHello()
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());

      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.
      IHelloCallbackContract callerProxy
        = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
      string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
      Console.WriteLine("Sending back: " + response);