管理连接和会话 (XMLA)

“有状态”是服务器在方法调用之间保留客户端的标识和上下文的情形。“无状态”是服务器在方法调用结束后未记住客户端的标识和上下文的情形。

若要提供有状态,则 XML for Analysis (XMLA) 需支持允许一系列语句一起执行的“会话”。例如,创建要在后续查询中使用的计算成员就是这样的一系列语句。

通常,XMLA 中的会话遵循 OLE DB 2.6 规范中所述的以下行为:

  • 会话定义事务和命令上下文范围。

  • 可以在一个会话的上下文中运行多个命令。

  • 通过使用 Execute 方法发送的特定于访问接口的命令支持 XMLA 上下文中的事务。

XMLA 定义了一种方法,用于在 Web 环境中以与分布式创作和版本管理 (DAV) 协议所使用的方法类似的模式支持会话,以便在松散耦合环境中实现锁定。此实现遵循 DAV,允许访问接口由于各种原因而终止会话(例如超时或连接错误)。支持会话时,Web 服务必须能够知道必须重新启动的已中断命令集,并准备好进行处理。

万维网联盟 (W3C) 简单对象访问协议 (SOAP) 规范建议在 SOAP 消息的最前面使用 SOAP 标头以构建新协议。下表列出了 XMLA 定义的用于启动、维护和关闭会话的 SOAP 标头元素和属性。

SOAP 标头

说明

BeginSession

此标头请求访问接口创建新会话。访问接口应通过以下方式进行响应:构造新会话并将会话 ID 作为 SOAP 响应中 Session 标头的一部分返回。

SessionId

值区域包含会话 ID,在该会话此后的每个方法调用中都必须使用此 ID。SOAP 响应中的访问接口会发送此标记,客户端也必须在每个 Session 标头元素中发送此属性。

Session

对于会话中发生的每个方法调用,都必须使用此标头,此标头的值区域中必须包含会话 ID。

EndSession

若要终止会话,请使用此标头。值区域中必须包含会话 ID。

注意注意

会话 ID 并不保证会话保持有效。如果会话过期(例如,会话超时或者连接中断),访问接口可以选择结束和回滚该会话的操作。因此,来自客户端的对会话 ID 的所有后续方法调用都将失败,返回错误以通知会话无效。客户端应处理此情况,并准备从头开始重新发送这些会话方法调用。

旧代码示例

下面的示例演示如何支持会话。

  1. 若要开始会话,请在 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>
    
  2. 来自访问接口的 SOAP 响应消息使用 XMLA 标头标记 <SessionId> 将会话 ID 包含在返回标头区域中。

    <SOAP-ENV:Header>
       <XA:Session
          xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
          SessionId="581"/>
    </SOAP-ENV:Header>
    
  3. 会话中的每个方法调用都必须添加 Session 标头,其中包含从访问接口返回的会话 ID。

    <SOAP-ENV:Header>
       <XA:Session
          xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
          mustUnderstand="1"
          SessionId="581"/>
    </SOAP-ENV:Header>
    
  4. 会话完成时,使用 <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>