Aufrechterhalten des Zustands auf dem Server zwischen Aufrufen

Häufig ist es notwendig, den Zustand auf dem Server zwischen separaten RPC-Aufrufen beizubehalten – die Verwendung von Kontexthandles ist die beste Möglichkeit dazu. Einige Worte dazu, wie Kontexthandles intern funktionieren, helfen zu verstehen, wann Kontexthandles am besten funktionieren.

Der Client empfängt nie den Zustand, der auf dem Server beibehalten wird. In den meisten Fällen ist der Zustand auf dem Server ein Zeiger auf einen Speicherblock, und der Client hat keine Informationen darüber. Alles, was der Client empfängt, ist eine große eindeutige Zahl mit anderen informationen, die der Server an den Client sendet und die das Kontexthandle in allen nachfolgenden Vorgängen darstellt. Wenn der Client auf ein geöffnetes Handle verweist, sendet er die große Anzahl, die er vom Server empfangen hat, wenn dieses Kontexthandle geöffnet wurde.

Der Server verfolgt alle großen Zahlen, die er an einen Client sendet. Wenn der Server eine große Zahl empfängt, die ein Kontexthandle darstellt, sucht er die Zahl in der Auflistung der gültigen, ausstehenden Kontexthandles für diesen Client und findet den serverseitigen Kontext, der einer bestimmten großen Zahl entspricht. Dies wird an die Serverroutine übergeben. Wenn die große Zahl nicht gefunden wird, wird eine RPC_X_SS_CONTEXT_MISMATCH Ausnahme ausgelöst und an den Client weitergegeben.

Die Korollare dieses Entwurfs sind wie folgt:

  • Ein Kontexthandle ist nur im Kontext der vorhandenen Client-/Serversitzung gültig. Sie kann nicht an einen anderen Client übergeben werden.
  • Ein Kontexthandle wird ungültig, wenn der Server neu gestartet wird oder anderweitig die Verbindung mit dem Client verloren geht.
  • Der Client kann nicht interpretieren, was das Kontexthandle auf dem Server darstellt. Für einen Client sind alle Kontexthandles einfach große Zahlen.

Wenn der Client ausfällt, erhält der Server eine Benachrichtigung und sauber seine Kontexthandles mithilfe des Herunterlaufmechanismus auf.