共用方式為


處理連線中斷

RPC 呼叫完成之後,不會關閉連線;它標示為免費。 因此,當連線位於集區時,伺服器可能會關閉或網路連線在通話期間或之間遺失。 就原則而言,只有在符合下列兩個條件時,RPC 執行時間才會重新嘗試這些呼叫:

  • 伺服器無法執行呼叫,或呼叫具有等冪性。
  • 用戶端可以有效率的方式實作重試。

下列段落會展開並厘清這兩個條件。

等冪呼叫是可在伺服器上多次執行的呼叫,而不會產生不想要的副作用。 例如,在銀行中查詢指定帳戶餘額的 RPC 呼叫是等冪的。 如果因為連線中斷而執行此呼叫兩次,則不會造成損害。 另一個等冪呼叫範例是變更資料庫中客戶的位址。 執行兩次很正常,因為第二次執行只會以相同的位址取代已經存在的位址。 「從帳戶 xyz 減去五元」之類的作業不是等冪的。 網路連線中斷不應該造成這類呼叫的多次執行。

若要安全,RPC 執行時間會將所有呼叫視為非等冪。 ncacn_ip_tcp不支援 [等冪] 屬性,而且會被忽略。 因此,上述清單中的第一個條件會縮減為 無法執行呼叫的伺服器

在許多情況下,RPC 執行時間無法確定尚未在伺服器上執行呼叫。 在這種情況下,用戶端不會重試執行呼叫。

下列範例說明 RPC 執行時間何時執行或未重試呼叫:

  • 伺服器重新開機。

    簡單的無安全性 RPC 呼叫是在重新開機之後未進行先前呼叫的介面上進行。 由於此介面上沒有呼叫,因此 RPC 執行時間會先嘗試交涉介面的使用。 它會使用集區中的連線來傳送封包。 由於伺服器已重新開機,且連線不再有效,因此會傳回錯誤。 由於用戶端 RPC 執行時間尚未開始傳送實際呼叫的資料,因此用戶端會判斷伺服器可能無法在這些資料上執行。 因此,它會關閉連線,並在集區中尋找另一個連線。 如果找不到連接,則會開啟新的連線,並嘗試再次交涉使用介面。 如果成功,則會 (進行呼叫,也就是重試,因為呼叫在啟動) 之前偵測到失敗。

  • 具有隱私權層級安全性 (加密) 的 RPC 呼叫是在已交涉的安全性內容連線上進行。

    為了確保有效率的效能,RPC 執行時間會將封送處理的封包內嵌加密, (純文字資料) 。 如果嘗試傳送資料失敗,RPC 執行時間無法重試呼叫,因為已以加密的資料覆寫純文字資料,而且無法以新的安全性內容重新加密資料。 因此,不會重試。

  • 傳送非第一個片段會失敗。

    未重試,因為 RPC 執行時間可能會選擇在完成之後捨棄第一個片段的內容,而且無法重試傳送第一個片段。

  • RPC 要求會傳送。

    伺服器中止連接。 不會嘗試重試,因為 RPC 無法分辨伺服器是否收到呼叫並開始執行它。

如果伺服器使用動態端點,RPC 將不會在重試期間重新解析端點。 這表示,如果伺服器關閉並備份,它可能位於不同的端點上,而 RPC 不會在重試呼叫時以透明方式重新解析端點。 若要強制重新解析端點,RPC 用戶端應該先呼叫 RpcBindingReset ,再重試呼叫。

在這些情況下,如果 RPC 用戶端可以判斷呼叫是否具有等冪性,或如果它保留 RPC 捨棄的資料,它可能會選擇在 RPC 之上建置重試機制。

注意

如果伺服器是叢集,而叢集的不同節點會執行不同版本的伺服器軟體,RPC 重試可能會在容錯移轉的情況下,將呼叫放在叢集的不同節點上,也可能位於不同版本的伺服器上。 在這類部署案例中,請確定用戶端不會依賴特定版本的伺服器軟體來執行指定的呼叫。 如果這樣做,用戶端應該在 RPC 之上建置機制,以偵測並處理這類狀況。