Управление соединениями и сеансами (XMLA)

Контроль изменения состояния — это условие, во время которого сервер сохраняет идентификатор и контекст клиента между вызовами метода. Отсутствие контроля изменения состояния — это условие, во время которого сервер не запоминает идентификатор и контекст клиента после завершения вызова метода.

Для обеспечения контроля изменения состояния XML для аналитики (XMLA) поддерживает сеансы, которые позволяют выполнять серии инструкций совместно. Примером такой серии инструкций служит создание вычисляемого элемента, который будет использоваться в последующих запросах.

В общем поведение сеансов в XMLA соответствует описанию, приведенному в спецификации OLE DB 2.6:

  • Сеансы определяют область контекста команд и транзакций.

  • В контексте одного сеанса могут выполняться несколько команд.

  • Поддержка транзакций в контексте XMLA обеспечивается через характерные для поставщика команды, отправляемые с методом Execute.

XMLA определяет способ поддержки сеансов в веб-среде, похожий на тот, который используется в протоколе DAV для реализации блокировки в слабосвязанной среде. Эта реализация соответствует протоколу DAV в том, что поставщик может закрывать сеансы по различным причинам (например, из-за ошибки времени ожидания или соединения). В случае поддержки сеансов, веб-службы должны знать об этом и быть готовыми к обработке прерванных наборов команд, которые необходимо перезапускать.

В спецификации протокола SOAP консорциума World Wide Web (W3C) рекомендуется использовать заголовки SOAP для построения новых протоколов поверх сообщений SOAP. В приведенной далее таблице перечислены элементы и атрибуты заголовков SOAP, которые XMLA определяет для запуска, ведения и закрытия сеанса.

Заголовок SOAP

Description

BeginSession

Этот заголовок запрашивает у поставщика создание нового сеанса. В ответ поставщик должен создать новый сеанс и возвратить его идентификатор, как часть заголовка Session в ответе SOAP.

SessionId

Область значения содержит идентификатор сеанса, который необходимо использовать в каждом вызове метода в течение сеанса. В ответе SOAP поставщик отправляет этот тег, а клиент также должен отправлять этот атрибут с каждым элементом заголовка Session.

Сеанс

Этот заголовок должен использоваться для каждого вызова метода в рамках данного сеанса, а в области значения заголовка должен указываться идентификатор сеанса.

EndSession

Используйте этот заголовок для прерывания сеанса. Идентификатор сеанса необходимо указывать в области значения.

ПримечаниеПримечание

Идентификатор сеанса не гарантирует того, что сеанс остается допустимым. Если время сеанса истекает (например, если истекло его время ожидания или потеряно соединение), поставщик может завершить и откатить действия, выполнявшиеся во время сеанса. В результате все последующие вызовы методов, отправленные клиентом с идентификатором сеанса, завершатся ошибкой, сигнализирующей, что сеанс недопустим. Клиент должен обработать это условие и быть готовым повторно отправить вызовы метода сеанса с начала.

Пример кода прежних версий

В следующем примере показано, как поддерживаются сеансы.

  1. Чтобы начать сеанс, добавьте заголовок BeginSession в SOAP в исходящий от клиента вызов метода XMLA. Первоначально область значения остается пустой, поскольку идентификатор сеанса пока не известен.

    <SOAP-ENV:Envelope   xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"   SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">   <SOAP-ENV:Header>      <XA:BeginSession         xmlns:XA="urn:schemas-microsoft-com:xml-analysis"         xsi:type="xsd:int"         mustUnderstand="1"/>   </SOAP-ENV:Header>   <SOAP-ENV:Body>      ...<!-- Discover or Execute call goes here.-->   </SOAP-ENV:Body></SOAP-ENV:Envelope>
    
  2. В ответном сообщении SOAP от поставщика в возвращаемой области заголовка при помощи тега заголовка XMLA <SessionId> указывается идентификатор сеанса.

    <SOAP-ENV:Header>   <XA:Session      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"      SessionId="581"/></SOAP-ENV:Header>
    
  3. В каждый вызов метода в рамках этого сеанса необходимо добавлять заголовок Session, содержащий идентификатор сеанса, который возвратил поставщик.

    <SOAP-ENV:Header>   <XA:Session      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"      mustUnderstand="1"      SessionId="581"/></SOAP-ENV:Header>
    
  4. Когда сеанс завершен, используется тег <EndSession>, содержащий связанное значение идентификатора сеанса.

    <SOAP-ENV:Header>   <XA:EndSession      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"      xsi:type="xsd:int"      mustUnderstand="1"      SessionId="581"/></SOAP-ENV:Header>