有状态 是服务器在方法调用之间保留客户端的标识和上下文的条件。 无状态 是一种条件,在方法调用完成后,服务器不会记住客户端的标识和上下文。
为了提供有状态性,XML for Analysis (XMLA) 支持允许一系列语句一起执行的 会话 。 此类语句的一个示例是创建要用于后续查询的计算成员。
通常,XMLA 中的会话遵循 OLE DB 2.6 规范概述的以下行为:
会话定义事务和命令上下文范围。
可以在单个会话的上下文中运行多个命令。
对 XMLA 上下文中的事务的支持是通过使用 Execute 方法发送的特定于提供程序的命令。
XMLA 定义了一种在类似于分布式创作和版本控制 (DAV) 协议用于在松散耦合环境中实现锁定的方法的模式中的 Web 环境中支持会话的方法的方法。 此实现与 DAV 并行,因为提供程序出于各种原因(例如超时或连接错误)使会话过期。 支持会话时,Web 服务必须注意并准备好处理必须重启的中断的命令集。
万维网联盟 (W3C) 简单对象访问协议 (SOAP) 规范建议使用 SOAP 标头在 SOAP 消息的基础上构建新协议。 下表列出了 XMLA 定义的用于启动、维护和关闭会话的 SOAP 标头元素和属性。
| SOAP 标头 | DESCRIPTION |
|---|---|
| BeginSession | 此标头请求提供程序创建新会话。 提供程序应通过构造新会话并返回会话 ID 作为 SOAP 响应中的会话标头的一部分来响应。 |
| SessionId(会话ID) | 值区域包含必须在会话其余部分的每个方法调用中使用的会话 ID。 SOAP 响应中的提供程序发送此标记,客户端还必须为每个 Session 标头元素发送此属性。 |
| 会话 | 对于会话中发生的每个方法调用,必须使用此标头,并且会话 ID 必须包含在标头的值区域中。 |
| EndSession | 若要终止会话,请使用此标头。 会话 ID 必须与值区域一起包含。 |
注释
会话 ID 不保证会话保持有效。 如果会话过期(例如,如果超时或连接丢失),提供程序可以选择结束并回滚该会话的作。 因此,客户端对会话 ID 的所有后续方法调用都失败,并出现错误,指示会话无效。 客户端应处理此条件,并准备好从头重新发送会话方法调用。
旧代码示例
以下示例演示如何支持会话。
若要开始会话,请将 SOAP 中的 BeginSession 标头添加到客户端的出站 XMLA 方法调用。 值区域最初为空,因为会话 ID 尚未知。
<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>来自提供程序的 SOAP 响应消息包括返回标头区域中的会话 ID,使用 XMLA 标头标记 <SessionId>。
<SOAP-ENV:Header> <XA:Session xmlns:XA="urn:schemas-microsoft-com:xml-analysis" SessionId="581"/> </SOAP-ENV:Header>对于会话中的每个方法调用,必须添加会话标头,其中包含从提供程序返回的会话 ID。
<SOAP-ENV:Header> <XA:Session xmlns:XA="urn:schemas-microsoft-com:xml-analysis" mustUnderstand="1" SessionId="581"/> </SOAP-ENV:Header>会话完成后, <将使用 EndSession> 标记,其中包含相关的会话 ID 值。
<SOAP-ENV:Header> <XA:EndSession xmlns:XA="urn:schemas-microsoft-com:xml-analysis" xsi:type="xsd:int" mustUnderstand="1" SessionId="581"/> </SOAP-ENV:Header>