Поддержание состояния на сервере между вызовами
Часто требуется поддерживать состояние на сервере между отдельными вызовами RPC. Для этого лучше всего использовать дескрипторы контекста. Несколько слов о том, как обработка контекста работает внутри, помогает понять, когда обработка контекста работает лучше всего.
Клиент никогда не получает состояние, сохраненное на сервере. Чаще всего состояние на сервере — это указатель на блок памяти, и у клиента нет сведений о нем. Все, что получает клиент, — это большое уникальное число с другими связанными с ним данными, которое сервер отправляет клиенту и представляет дескриптор контекста во всех последующих операциях. Всякий раз, когда клиент ссылается на открытый дескриптор, он отправляет большое число, полученное от сервера при открытии этого дескриптора контекста.
Сервер отслеживает все большие числа, отправляемые клиенту. Когда сервер получает большое число, представляющее дескриптор контекста, он ищет его в коллекции допустимых необработанных дескрипторов контекста для этого клиента и находит контекст на стороне сервера, соответствующий заданному большому числу. Он передается в подпрограмму сервера. Если большое число не найдено, RPC_X_SS_CONTEXT_MISMATCH исключение вызывается и распространяется на клиент.
Ниже приведены примеры оформления.
- Дескриптор контекста действителен только в контексте существующего сеанса клиента или сервера. Его нельзя передать другому клиенту.
- Дескриптор контекста становится недопустимым, если сервер перезагружается или иным образом теряет подключение к клиенту.
- Клиент не может интерпретировать то, что представляет дескриптор контекста на сервере. Для клиента все дескрипторы контекста — это просто большие числа.
В случае сбоя клиента сервер получит уведомление и очистит дескрипторы контекста с помощью механизма запуска.