在 2018 年 7 月 .NET Framework Security and Quality Rollups 安裝後,結合交易流程與遠端呼叫的應用程式中,錯誤發生

套用到
.NET Framework 4.7.2 .NET Framework 4.7.1 .NET Framework 4.7 .NET Framework 4.6 .NET Framework 4.6.1 .NET Framework 4.6.2

症狀

當你在 Windows 7 服務包 1 (SP1) 、Windows Server 2008 R2 SP1 或 Windows Server 2008 SP2 安裝 2018 年 7 月的 .NET Framework 安全與品質整合,這些整合涵蓋 4.6、4.6.1、4.6.2、4.7、4.7.1 和 4.7.2 .NET Framework 時,你會發現符合以下條件的 .NET Framework 應用程式:

  • 該應用程式使用 System.Transaction.TransactionScope 類別的實例,透過將 TransactionScopeAsyncFlowOption.Enabled 傳入建構子來啟用交易流程。
  • 應用程式在其中一個交易範圍處於活躍狀態時,會進行一個或多個遠端呼叫。 此時,遠端呼叫指的是經過透明代理後抵達伺服器物件的任何通話。 遠端呼叫的例子包括呼叫其他應用程式域,以及透過遠端通訊通道(如 System.Runtime.Remoting.Channels 命名空間中定義的用戶端通道)呼叫。
  • 遠端呼叫結束後, System.Transactions.Transaction.Current 回傳的值為空值,而非遠端呼叫前回傳的值。

因應措施

為了解決這個問題,請嘗試以下任一方法:

  • 對於每個能啟用交易流程的交易範圍,請更改應用程式,確保在交易範圍內執行時,程式碼中不會有任何遠端呼叫發生。 當您判斷交易範圍是否包含任何遠端通話時,請考慮以下指引:

    • 呼叫靜態方法絕不等同於遠端呼叫。
    • 對於目標物件的實例方法呼叫,只有當目標物件是透明代理時,該呼叫才是遠端的。
    • 對於構造子的呼叫,只有當建構物件是透明代理時,該呼叫才是遠端的。

    你也可以使用 System.Runtime.Remoting.RemotingServices.IsTransparentProxy 方法來檢查物件是否為透明代理。

  • 移除 TransactionScopeAsyncFlowOption.Enabled 建構函數,即可停用交易流程。

    警告

    若交易範圍仍在活動時執行任何「等待」操作,此變通方法很可能會引發其他錯誤。

  • Transaction.Current 屬性不會自動序列化到遠端呼叫。 必須以參數形式傳遞。 如果遠端呼叫沒有將交易作為參數傳遞,且在遠端呼叫期間也沒有回調給用戶端,你可以在新的 TransactionScope 物件中建立遠端呼叫,該物件使用交易範圍 選項(TransactionScopeOptions.Suppress )。 在這個抑制交易範圍內, Transaction.Current 屬性為空值。

狀態

我們已意識到此問題,目前正努力尋求解決方案。