Kontexthandles
Es ist manchmal der Fall, dass verteilte Anwendungen erfordern, dass das Serverprogramm status Informationen zwischen Clientaufrufen verwaltet. Serverprogramme, die mehrere Clients gleichzeitig bedienen, müssen die Statusinformationen für jeden Client speichern. Da der Client und der Server unterschiedliche Adressräume auf verschiedenen Computern verwenden und sie sich nicht unbedingt gegenseitig vertrauen, funktionieren gängige Ansätze für die Datenfreigabe häufig nicht. Für instance können Client und Server nicht status Informationen zu ihrer Remotesitzung in globalen Variablen verwalten, da sie nicht denselben globalen Adressraum verwenden. Es ist schwierig, die Informationen in einer freigegebenen Datei zu speichern, da sie auf verschiedenen Computern ausgeführt werden. Ein einfacher Ansatz kann darin bestehen, den gesamten Zustand an den Client zu senden und ihn beim nächsten Aufruf vom Client zurückzugeben, aber dieser Ansatz weist Fehler auf: Der Server vertraut dem Client nicht unbedingt, dass der Client den richtigen Zustand zurückgibt, und der Zustand kann implizit an einen anderen Zustand auf dem Server gebunden sein, z. B. Dateihandles oder geöffnete Sockets.
Microsoft RPC bietet einen leistungsstarken und sicheren Mechanismus namens Kontexthandles zum Beibehalten des Zustands, der einem bestimmten Client auf einem Server zugeordnet ist. Die Zustandsinformationen werden als Serverkontext bezeichnet. Clients können ein Kontexthandle abrufen, um den Kontext des Servers für ihre einzelnen RPC-Sitzungen zu identifizieren.
Beispielsweise kann jeder Client in einer verteilten Anwendung vom Serverprogramm eine Datendatei für seine RPC-Sitzung erstellen und aktualisieren lassen. Der Server kann sein Dateihandle für die Datendatei jedes Clients als Kontexthandle verwenden. Jedes Mal, wenn ein Client Vorgänge für die Datendatei anfordert, die der Server dafür erstellt, übergibt der Client das Kontexthandle an den Server. Der Client erhält das Dateihandle selbst nicht. Es ruft ein undurchsichtiges Token ab, das die RPC-Laufzeit des Servers eindeutig dem Dateihandle zuordnen kann. Da das Kontexthandle tatsächlich ein Dateihandle ist, ist das Kontexthandle nur im Adressraum des Servers sinnvoll. Das Clientprogramm kann jedoch das Kontexthandle verwenden, um dem Server mitzuteilen, auf welcher Datei Updates ausgeführt werden sollen.
Andere Daten können auch Kontexthandles sein. Für instance können Client und Server die Datensatznummer eines Datenbankdatensatzes als Dateihandle verwenden. Wenn der Client eine Reihe von Updates für einen bestimmten Datensatz durchführen muss, kann er die Datensatznummer als Kontexthandle abrufen. Die Datensatznummer wird bei jedem Aufruf einer Remoteprozedur zum Aktualisieren des Datenbankdatensatzes an den Server übergeben.
In den meisten Fällen verweist ein Kontexthandle auf einen Speicherblock auf dem Server, auf dem der Server verschiedene Verwaltungsinformationen speichert.
Dieser Abschnitt enthält Informationen zum Definieren und Verwenden von Kontexthandles. Die Diskussion wird in den folgenden Themen vorgestellt:
- Schnittstellenentwicklung mithilfe von Kontexthandles
- Serverentwicklung mithilfe von Kontexthandles
- Cliententwicklung mithilfe von Kontexthandles
- Heruntergefahrene Serverkontextroutine
- Zurücksetzen des Clientkontexts
- Multithreadclients und Kontexthandles