有状态 是服务器在方法调用之间保留客户端的标识和上下文的条件。 无状态 是一种条件,在方法调用完成后,服务器不会记住客户端的标识和上下文。
为了提供有状态性,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>