상태 저장 은 서버가 메서드 호출 간에 클라이언트의 ID와 컨텍스트를 유지하는 조건입니다. 상태 비대화 는 메서드 호출이 완료된 후 서버가 클라이언트의 ID 및 컨텍스트를 기억하지 못하는 조건입니다.
상태 저장을 제공하기 위해 XMLA(XML for Analysis)는 일련의 문을 함께 수행할 수 있는 세션을 지원합니다. 이러한 일련의 문의 예는 후속 쿼리에서 사용할 계산 멤버를 만드는 것입니다.
일반적으로 XMLA의 세션은 OLE DB 2.6 사양에 설명된 다음 동작을 따릅니다.
세션은 트랜잭션 및 명령 컨텍스트 범위를 정의합니다.
단일 세션의 컨텍스트에서 여러 명령을 실행할 수 있습니다.
XMLA 컨텍스트에서 트랜잭션에 대한 지원은 Execute 메서드와 함께 전송된 공급자별 명령을 통해 지원됩니다.
XMLA는 느슨하게 결합된 환경에서 잠금을 구현하기 위해 DAV(Distributed Authoring and Versioning) 프로토콜에서 사용하는 방법과 유사한 방식으로 웹 환경에서 세션을 지원하는 방법을 정의합니다. 이 구현은 공급자가 다양한 이유(예: 시간 제한 또는 연결 오류)로 인해 세션을 만료할 수 있다는 측면에서 DAV와 유사합니다. 세션이 지원되는 경우 웹 서비스는 다시 시작해야 하는 중단된 명령 집합을 인식하고 처리할 준비가 되어 있어야 합니다.
W3C(World Wide Web 컨소시엄) SOAP(Simple Object Access Protocol) 사양에서는 SOAP 메시지 위에 새 프로토콜을 빌드하기 위해 SOAP 헤더를 사용하는 것이 좋습니다. 다음 표에서는 XMLA가 세션을 시작, 유지 관리 및 닫기 위해 정의하는 SOAP 헤더 요소 및 특성을 나열합니다.
| SOAP 헤더 | 설명 |
|---|---|
| BeginSession | 이 헤더는 공급자에게 새 세션을 만들도록 요청합니다. 공급자는 새 세션을 생성하고 SOAP 응답에서 세션 헤더의 일부로 세션 ID를 반환하여 응답해야 합니다. |
| 세션 아이디 | 값 영역에는 세션의 나머지 부분에 대한 각 메서드 호출에 사용해야 하는 세션 ID가 포함됩니다. SOAP 응답의 공급자는 이 태그를 보내고 클라이언트는 각 세션 헤더 요소와 함께 이 특성을 보내야 합니다. |
| 세션 | 세션에서 발생하는 모든 메서드 호출에 대해 이 헤더를 사용해야 하며 세션 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 응답 메시지에는 XMLA 헤더 태그 <SessionId를 사용하여 반환 헤더 영역에 세션 ID가 포함됩니다>.
<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>세션이 완료되면 <관련 세션 ID 값을 포함하는 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>