Поделиться через


Семантика сбоя для дескрипторов контекста

В этом разделе описывается семантика сбоя для дескрипторов контекста.

Семантика сбоя при закрытии дескриптора контекста завершается ошибкой

Представьте, что клиентское приложение пытается закрыть дескриптор контекста, открытый на сервере, не завершив процесс клиента. Кроме того, предположим, что вызов сервера для закрытия дескриптора контекста завершается сбоем (например, клиент выходит из памяти). Правильный способ обработки этой ситуации заключается в вызове функции RpcSsDeskClientContext. В таком случае клиент очищает свою сторону дескриптора контекста и прерывает подключение к серверу. Так как подключение действительно является пулом подключений (см. RPC и сетевой), который учитывается по одной ссылке для каждой открытой привязки или дескриптора контекста, уничтожая дескриптор контекста путем вызова функции RpcSsDetextClientContext не уничтожает подключение. Скорее, он уменьшает количество ссылок для пула соединений. Для закрытия подключений в пуле клиент должен закрыть все дескриптора привязки и маркеры контекста к серверу из клиентского процесса. Затем все подключения в пуле закрыты, а механизм запуска сервера инициируется и очищается.

Семантика сбоя во время изменения состояния дескриптора контекста

Сведения в этом разделе относятся к Windows XP и более поздним платформам.

Дескриптор контекста — это просто параметры функции. Все изменения в состоянии дескриптора контекста происходят, когда параметры маршалируются или немаршалируются. Например, если клиент открывает дескриптор контекста (изменяет его с NULL на неNULL), время выполнения RPC не открывает часть RPC дескриптора, пока аргументы не маршалируются для отправки клиенту. Ошибки могут возникать во время промежуточного периода. Из-за различных возможных сетевых или низких условий ресурсов передача пакета клиенту может завершиться ошибкой. Или подпрограмма сервера может вызвать исключение при попытке изменить дескриптор контекста. В таких или других ситуациях сбой клиент и сервер могут получать несогласованные представления дескриптора контекста. В этом разделе объясняется правило для состояния дескриптора контекста, а также ответственность за код клиента и сервера во время различных условий сбоя.

  • Возвращается дескриптор контекста NULL, но подпрограмма сервера обнаруживает сбой и вызывает исключение.

    Это ответственность за процедуру сервера для очистки любого состояния, связанного с контекстом, которое он мог создать. Время выполнения RPC очищает состояние.

  • Поступают маркеры контекста, отличные отNULL, но подпрограмма сервера обнаруживает сбой и вызывает исключение.

    Если подпрограмма сервера закрыла дескриптор контекста, клиент не будет знать об этом, так как вызов не будет выполнен. дальнейшее использование дескриптора контекста приведет к ошибке RPC_X_SS_CONTEXT_MISMATCH на клиенте. Если подпрограмма сервера не изменяет дескриптор контекста, клиент по-прежнему может использовать его. Если подпрограмма сервера изменяет сведения, хранящиеся в контексте сервера, новые вызовы от клиента будут использовать эти сведения.

  • При поступлении дескриптора контекста, отличного от NULL, и подпрограмма сервера закрывает дескриптор, но либо маршалирование после того, как дескриптор контекста был выполнен сбой, либо обработка после неудачного маршалинга.

    Дескриптор контекста закрыт, и дальнейшие вызовы этого клиента с помощью этого дескриптора контекста приводят к ошибке RPC_X_SS_CONTEXT_MISMATCH на клиенте.

  • При поступлении дескриптора контекста NULL сервер создает контекст для этого дескриптора, но либо маршалинг после маршалинга после маршалирования не удалось выполнить маршалинг.

    В этом случае время выполнения RPC вызывает запуск для этого дескриптора контекста и очищает состояние RPC для этого дескриптора контекста. Дескриптор контекста не будет создан на стороне клиента.

  • При поступлении дескриптора контекста, отличногоот NULL, сервер либо не изменяет дескриптор контекста, либо изменяет сведения, хранящиеся в контексте сервера, и маршалинг завершается сбоем после маршалирования дескриптора контекста.

    Новые вызовы от клиента будут использовать дескриптор контекста, который имеет сервер.

  • Дескриптор контекста NULL, и сервер не задает ему значение, отличное от NULL, но вызов завершается ошибкой до маршалирования дескриптора контекста.

    В этом случае на клиенте не создается дескриптор контекста.

  • Дескриптор контекста, отличный отNULL, и сервер задает для него значение NULL, но маршалинг завершается ошибкой до маршалирования дескриптора контекста.

    В этом случае дескриптор контекста остается закрытым на сервере, и клиент получает RPC_X_SS_CONTEXT_MISMATCH ошибки при попытке использовать дескриптор контекста.

  • Дескриптор контекста NULL поступает на сервер, а сервер устанавливает для него значение неNULL, но маршалинг завершается ошибкой до маршалирования дескриптора контекста.

    Запущенный дескриптор контекста должен вызываться таким образом, чтобы сервер смог очиститься, и на клиенте не будет создан дескриптор контекста.

  • Дескриптор контекста, отличный отNULL, поступает, и сервер либо не изменяет дескриптор контекста, либо изменяет сведения, хранящиеся в контексте сервера, и маршалинг завершается ошибкой до маршалирования дескриптора контекста.

    Новые вызовы от клиента будут использовать состояние на сервере.

  • Дескриптор контекста объявляется как возвращаемое значение, и подпрограмма сервера возвращает null для дескриптора контекста и маршалинг завершается сбоем до маршалирования дескриптора контекста.

    В этом случае на клиенте не создается новый контекст.

  • Дескриптор контекста объявляется как возвращаемое значение, и подпрограмма сервера возвращает не-NULL для дескриптора контекста и маршалинг завершается сбоем до маршалирования дескриптора контекста.

    Время выполнения RPC вызывает подпрограмму запуска дескриптора контекста, чтобы обеспечить возможность очистки, и новый контекст не создается на клиенте.