內容句柄的失敗語意
本主題討論內容句柄的失敗語意。
關閉內容句柄失敗時的失敗語意
假設用戶端應用程式嘗試關閉伺服器上開啟的內容句柄,而不需要關閉客戶端進程。 此外,假設呼叫伺服器以關閉內容句柄失敗(例如,用戶端記憶體不足)。 處理這種情況的適當方式是呼叫 RpcSsDestroyClientContext 函式。 在這種情況下,用戶端會清除其內容句柄的一端,並中止關閉與伺服器的連線。 由於連線確實是連線集區(請參閱 RPC 和網路),因此會針對每個開啟的系結或內容句柄使用一個參考進行參考計數,藉由呼叫 RpcSsDestroyClientContext 函式來終結內容句柄,實際上不會終結連線。 相反地,它會遞減連接集區的參考計數。 若要關閉集區中的連線,客戶端必須從客戶端進程關閉所有系結句柄和內容句柄。 然後集區中的所有連線都會關閉,並啟動並清除伺服器執行機制。
內容句柄狀態變更期間的失敗語意
本節中的資訊是指 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 運行時間會呼叫內容句柄執行例程,讓它有機會清除,而且用戶端上不會建立任何新內容。