內容控制碼的失敗語意
本主題討論內容控制碼的失敗語意。
關閉內容控制碼失敗時的失敗語意
假設用戶端應用程式嘗試關閉伺服器上開啟的內容控制碼,而不需關閉用戶端進程。 此外,假設呼叫伺服器以關閉內容控制碼失敗 (,例如,用戶端記憶體不足) 。 處理這種情況的適當方式是呼叫 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 執行時間會呼叫內容控制碼執行常式,讓您有機會清除,而且用戶端上不會建立任何新內容。