Поделиться через


Сессия

В примере сеанса показано, как реализовать контракт, для которого требуется сеанс. Сеанс предоставляет контекст для выполнения нескольких операций. Это позволяет службе связывать состояние с заданным сеансом, таким образом, что последующие операции могут использовать состояние предыдущей операции. Этот пример основан на разделе первичных шагов, который реализует калькуляторный сервис. Контракт ICalculator был изменен, чтобы разрешить выполнение арифметических операций, сохраняя результат выполнения. Эта функция определяется контрактом ICalculatorSession . Служба поддерживает состояние клиента, так как для выполнения вычисления вызываются несколько операций службы. Клиент может получить текущий результат путем вызова Result() и очистки результата до нуля путем вызова Clear().

В этом примере клиентом является консольное приложение (.exe), а служба хостится с помощью Internet Information Services (IIS).

Замечание

Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.

Установка SessionMode контракта на Required гарантирует, что когда контракт предоставляется через определенную привязку, она поддерживает сеансы. Если привязка не поддерживает сеансы, выбрасывается исключение. Интерфейс ICalculatorSession определяется таким образом, что можно вызвать одну или несколько операций, которая изменяет результат выполнения, как показано в следующем примере кода.

[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 Result();
}

Служба использует InstanceContextMode для PerSession привязки контекста экземпляра данной услуги к каждому входящему сеансу. Это позволяет службе поддерживать выполняемый результат для каждого сеанса в локальной переменной члена.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorSession
{
    double result = 0.0D;

    public void Clear()
    {  result = 0.0D; }

    public void AddTo(double n)
    {  result += n;   }

    public void SubtractFrom(double n)
    {  result -= n;   }

    public void MultiplyBy(double n)
    {  result *= n;   }

    public void DivideBy(double n)
    {  result /= n;   }

    public double Result()
    {  return result; }
}

При запуске примера клиент выполняет несколько запросов к серверу и запрашивает результат, который затем отображается в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.

(((0 + 100) - 50) * 17.65) / 2 = 441.25
Press <ENTER> to terminate client.

Настройка, сборка и запуск примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.