XML Web-службы в Microsoft SQL Server 2005 - Сессии
ОГЛАВЛЕНИЕ
Сессии
Архитектура Web-служб в чистом виде является stateless, т.е. не имеет состояния. Однако многие инфраструктуры вроде ASP.NET Web Services позволяют создавать statefull (имеющие состояние) Web-службы. Web-службы Yukon также могут хранить состояние, однако с точки зрения архитектуры их отличие от ASP.NET Web Services заключается в том, что Yukon хранит идентификаторы сессий в заголовках SOAP-пакетов, а не в cookies.
Сессия является внутренним, ядерным объектом сервера. Список всех сессий можно просмотреть с помощью динамического представления sys.dm_exec_sessions. Время жизни сессии может быть задано при создании конечной точки. По умолчанию оно составляет 60 секунд. Создание сессии производится с помощью посылки заголовка SQLSession:
<sqloptions:sqlSession initiate=»true»/>
где sqloptions префикс пространства имен http://schemas.microsoft.com/ sqlserver/2004/SOAP/Options.
После этого сервер наряду с обычными результатами выборки возвращает тот же самый заголовок, но уже с атрибутами sessionId — идентификатор сессии и timeout — время жизни сессии. Идентификатор сессии кодируется в форму base64 и в дальнейшем используется при следующих запросах. Идентификатор сессии строго привязан к учетным данным клиента Windows, который инициировал сессию. Запрещается использовать тот же самый идентификатор под другими учетными данными. Сессия действительна до тех пор, пока не истечет время ее жизни или пока клиент сам не завершит ее. Завершение сессии достигается путем посылки заголовка SQLSession с атрибутом terminate:
<sqloptions:sqlSession terminate=»true» sessionId=»eAV9/GUw2U6g/89aUWzp4g==»/>
Запрос на завершение сессии может не содержать ничего, кроме заголовка. Если сервер успешно закрывает сессию, он присылает ответное сообщение с точно таким же заголовком и точно такими же значениями атрибутов.
Для использования сессий в своем приложении придется формировать заголовок SQLSession самостоятельно. В случае SOAP Toolkit, как я уже говорил выше, это можно сделать с помощью интерфейса IHeaderHandler. Для Visual Studio все значительно проще: в BOL есть пример данного заголовка.