Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В приложениях Windows Communication Foundation (WCF) сеанс связывает группу сообщений в разговор. Сеансы WCF отличаются от объекта сеанса, доступного в ASP.NET приложениях, поддерживают различные поведение и управляются разными способами. В этом разделе описываются функции, которые поддерживаются сеансами в приложениях WCF и как их использовать.
Сеансы в приложениях Windows Communication Foundation
Если контракт службы указывает, что требуется сеанс, этот контракт указывает, что все вызовы (то есть базовые обмены сообщениями, поддерживающие вызовы), должны быть частью одной беседы. Если контракт указывает, что он разрешает сеансы, но не требует одного, клиенты могут подключаться и устанавливать сеанс или не устанавливать сеанс. Если сеанс заканчивается, и сообщение отправляется через тот же канал, исключение возникает.
Сеансы WCF имеют следующие основные концептуальные функции:
Они явно инициируются и завершаются вызывающим приложением (клиент WCF).
Сообщения, доставленные во время сеанса, обрабатываются в том порядке, в котором они получаются.
Сеансы связывают группу сообщений в разговор. Возможны различные типы корреляции. Например, один канал на основе сеансов может коррелировать сообщения на основе общего сетевого подключения, а другой канал на основе сеансов может коррелировать сообщения на основе общего тега в тексте сообщения. Характеристики, которые могут быть получены из сеанса, зависят от характера корреляции.
Общее хранилище данных не связано с сеансом WCF.
Если вы знакомы с классом System.Web.SessionState.HttpSessionState в ASP.NET приложениях и функциональных возможностях, которые он предоставляет, вы можете заметить следующие различия между этим типом сеансов и сеансов WCF:
ASP.NET сеансы всегда инициируются сервером.
ASP.NET сеансы неявно неупорядочены.
ASP.NET сеансы предоставляют общий механизм хранения данных в запросах.
В этом разделе описываются следующие темы:
Поведение выполнения по умолчанию при использовании привязок на основе сеансов на уровне модели службы.
Типы особенностей, которые предоставляют сеансовые системные привязки WCF.
Как создать контракт, указывающий требование сеанса.
Как понять и управлять созданием и завершением сеанса и взаимосвязью между сеансом и экземпляром службы.
Поведение выполнения по умолчанию, используя сеансы
Привязка, которая пытается инициировать сеанс, называется привязкой на основе сеанса . Контракты служб указывают, что они требуют, разрешают или отклоняют привязки на основе сеансов, установив свойство ServiceContractAttribute.SessionMode интерфейса контракта службы (или класс) на одно из значений перечисления System.ServiceModel.SessionMode. По умолчанию значение этого свойства — Allowedэто означает, что если клиент использует привязку на основе сеанса с реализацией службы WCF, служба устанавливает и использует предоставленный сеанс.
Если служба WCF принимает сеанс клиента, по умолчанию включены следующие функции:
Все вызовы между клиентским объектом WCF обрабатываются тем же экземпляром службы.
Различные привязки на основе сеансов предоставляют дополнительные возможности.
System-Provided Типы сеансов
Привязка на основе сеансов поддерживает стандартное сопоставление экземпляра службы с конкретным сеансом. Однако различные привязки на основе сеансов поддерживают различные функции, помимо включения ранее описанного элемента управления на основе сеансов.
WCF предоставляет следующие типы поведения приложений на основе сеансов:
Поддерживаются System.ServiceModel.Channels.SecurityBindingElement сеансы на основе безопасности, в которых оба конца обмена данными договорились о конкретном безопасном разговоре. Дополнительные сведения см. в разделе "Защита служб". Например, привязка System.ServiceModel.WSHttpBinding , содержащая поддержку сеансов безопасности и надежных сеансов, по умолчанию использует только безопасный сеанс, который шифрует сообщения и подписывает цифровые данные.
Привязка System.ServiceModel.NetTcpBinding поддерживает сеансы на основе TCP/IP, чтобы убедиться, что все сообщения коррелируются подключением на уровне сокета.
Элемент System.ServiceModel.Channels.ReliableSessionBindingElement, реализующий спецификацию WS-ReliableMessaging, обеспечивает поддержку надежных сеансов, в которых сообщения можно настроить для доставки в правильном порядке и ровно один раз, обеспечивая получение сообщений даже при движении по нескольким узлам во время беседы. Дополнительные сведения см. в разделе "Надежные сеансы".
Привязка System.ServiceModel.NetMsmqBinding предоставляет сеансы датаграмм MSMQ. Дополнительные сведения см. в разделе "Очереди" в WCF.
Установка свойства SessionMode не указывает тип сеанса, который требуется контракту, а только подтверждает, что сеанс необходим.
Создание контракта, требующего проведения сессии
Создание контракта, требующего сеанса, указывает, что группа операций, предусмотренных контрактом обслуживания, должна выполняться в одном сеансе, а сообщения должны быть доставлены по порядку. Чтобы указать уровень поддержки сеансов, требуемый контрактом службы, настройте свойство ServiceContractAttribute.SessionMode вашего интерфейса или класса контракта службы на значение из перечисления System.ServiceModel.SessionMode, чтобы определить, требуется ли контракт:
Требуется сеанс.
Позволяет клиенту установить сеанс.
Запрещает сеанс.
Однако установка свойства SessionMode не указывает, какой тип поведения на основе сеанса требуется контракту. Он указывает WCF подтвердить во время выполнения, что настроенная привязка (которая создает канал связи) для службы может, не может или устанавливает сеанс при реализации службы. Опять же, привязка может удовлетворить это требование с любым типом сеансового поведения, которое она выбирает, будь то безопасность, транспорт, надёжность или их комбинация. Точное поведение зависит от выбранного System.ServiceModel.SessionMode значения. Если настроенная привязка службы не соответствует значению SessionMode, создается исключение. Привязки и каналы, которые они создают и которые поддерживают сеансы, называются основанными на сеансах.
Следующий контракт на обслуживание указывает, что все операции в сеансе ICalculatorSession
должны обмениваться. Ни одна из операций не возвращает значение вызывающему, кроме метода Equals
. Однако метод не принимает параметров и, следовательно, Equals
может возвращать только ненулевое значение внутри сеанса, в котором данные уже переданы другим операциям. Этот контракт требует правильного функционирования сеанса. Без сеанса, связанного с определенным клиентом, экземпляр службы не может знать, какие предыдущие данные отправлены этим клиентом.
[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 Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
Если служба разрешает сеанс, сеанс устанавливается и используется, если клиент инициирует его; в противном случае сеанс не установлен.
Сеансы и экземпляры служб
Если в WCF используется поведение инстанцирования по умолчанию, все вызовы между клиентским объектом WCF обрабатываются тем же экземпляром службы. Таким образом, на уровне приложения можно рассматривать сеанс как включение поведения приложения, аналогичное поведению локального вызова. Например, при создании локального объекта:
Вызывается конструктор.
Все последующие вызовы, направленные к ссылке на клиентский объект WCF, обрабатываются тем же экземпляром объекта.
Деструктор вызывается при уничтожении ссылки на объект.
Сеансы обеспечивают аналогичное поведение между клиентами и службами, если используется поведение экземпляра службы по умолчанию. Если контракт службы требует или поддерживает сеансы, одну или несколько операций контракта можно пометить как инициирующие или завершающие сеанс, установив свойства IsInitiating и IsTerminating.
Начальные операции — это те, которые должны вызываться в качестве первой операции нового сеанса. Операции без инициации можно вызывать только после того, как была вызвана хотя бы одна инициирующая функция. Таким образом, можно создать своего рода конструктор сеанса для вашей службы, объявив инициирующие операции, предназначенные для получения входных данных от клиентов, подходящих для начала экземпляра службы. (Однако состояние связано с сеансом, а не объектом службы.)
Завершающие операции, наоборот, — это те, которые должны вызываться как последнее сообщение в существующем сеансе. В случае по умолчанию WCF перерабатывает объект службы, в том числе и его контекст, после завершения сеанса, с которым была связана услуга. Таким образом, можно создать тип деструктора, объявив завершающие операции, предназначенные для выполнения функции, соответствующей концу экземпляра службы.
Замечание
Хотя поведение по умолчанию имеет сходство с локальными конструкторами и деструкторами, это только сходство. Любая операция службы WCF может быть как инициирующей, так и завершающей, или выполнять обе функции одновременно. Кроме того, в случае по умолчанию инициирующие операции можно вызывать любое количество раз в любом порядке; никакие дополнительные сеансы не создаются после того, как сеанс будет установлен и связан с экземпляром, если вы явно не контролируете срок службы экземпляра службы (управляя объектом System.ServiceModel.InstanceContext). Наконец, состояние связано с сеансом, а не с объектом службы.
Например, контракт, используемый в предыдущем примере, ICalculatorSession
требует, чтобы клиентский объект WCF сначала вызвал Clear
операцию перед любой другой операцией и что сеанс с этим клиентским объектом WCF должен завершиться при вызове Equals
операции. В следующем примере кода показан контракт, который применяет эти требования.
Clear
сначала необходимо вызвать для запуска сеанса, и этот сеанс заканчивается при Equals
вызове.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
Службы не запускают сеансы с клиентами. В клиентских приложениях WCF существует прямая связь между сроком действия канала на основе сеанса и сроком действия самого сеанса. Таким образом, клиенты создают новые сеансы, открывая новые каналы, основанные на сеансах, и завершают существующие сеансы, аккуратно закрывая такие каналы. Клиент запускает сеанс с конечной точкой службы, вызывая один из следующих вызовов:
ICommunicationObject.Open на канале, возвращенном вызовом ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Open на клиентском объекте WCF, созданном средством служебной программы метаданных ServiceModel (Svcutil.exe).
Операция запуска для любого типа объекта клиента WCF (по умолчанию все операции являются запускающими). При вызове первой операции объект клиента WCF автоматически открывает канал и инициирует сеанс.
Обычно клиент завершает сеанс с конечной точкой службы, вызывая одно из следующих вызовов:
ICommunicationObject.Close на канале, возвращенном вызовом ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close на объекте клиента WCF, созданном Svcutil.exe.
Завершающая операция для любого типа клиентского объекта WCF (по умолчанию никакие операции не завершаются; контракт должен явно указать завершающее операцию). При вызове первой операции объект клиента WCF автоматически открывает канал и инициирует сеанс.
Примеры см. в разделе "Практическое руководство. Создание службы, требующей сеансов ", а также примеры поведения службы по умолчанию и инстантирования .
Дополнительные сведения о клиентах и сеансах см. в разделе Accessing Services Using a WCF Client.
Сеансы взаимодействуют с параметрами InstanceContext
Существует взаимодействие между SessionMode перечислением в контракте и ServiceBehaviorAttribute.InstanceContextMode свойством, которое управляет связью между каналами и конкретными объектами службы. Дополнительные сведения см. в разделе "Сеансы", "Instancing" и "Параллелизм".
Общий доступ к объектам InstanceContext
Вы также можете управлять тем, какой канал на основе сеансов или вызов связан с объектом InstanceContext, выполняя это сопоставление самостоятельно.
Сеансы и потоковая передача
При передаче большого объема данных режим потоковой передачи в WCF является приемлемой альтернативой поведению по умолчанию, при котором сообщения полностью буферизуются и обрабатываются в памяти. При потоковых вызовах с привязкой на основе сеанса может возникнуть непредвиденное поведение. Все вызовы потоковой передачи выполняются через один канал (канал диаграммы данных), который не поддерживает сеансы, даже если используемая привязка настроена для использования сеансов. Если несколько клиентов выполняют потоковую передачу вызовов одному объекту службы через сеансовую привязку, и для режима параллелизма объекта службы установлен режим 'один', а для режима контекста экземпляра задано значение PerSession
, все вызовы должны проходить через канал дейтаграммы, и поэтому только один вызов может обрабатываться за раз. Один или несколько клиентов могут выйти по таймауту. Эту проблему можно обойти, установив параметр InstanceContextMode
объекта службы на значение PerCall
или параллелизм на несколько потоков.
Замечание
MaxConcurrentSessions не действует в этом случае, так как доступен только один сеанс.