徵狀
在 Windows 7 Service Pack 1 (SP1)、Windows Server 2008 R2 SP1 或 Windows Server 2008 SP2 上安裝適用於 .NET Framework 4.6、4.6.1、4.6.2、4.7、4.7.1 和 4.7.2 的 2018 年 7 月 .NET Framework 安全性和品質彙總套件之後,您在符合下列條件的 .NET Framework 應用程式中發現錯誤:
-
應用程式使用 System.Transaction.TransactionScope 類別的執行個體,其中的交易流程是透過傳遞 TransactionScopeAsyncFlowOption.Enabled 至建構函式的方式啟用。
-
當其中一個交易範圍為作用中時,應用程式發出一個或多個遠端呼叫。 在這個情況中,遠端呼叫是指抵達伺服器物件前周遊於 Transparent Proxy 的任何呼叫。 遠端呼叫的範例包括對其他應用程式網域的呼叫,以及透過遠端通道 (例如 System.Runtime.Remoting.Channels 命名空間中定義的用戶端通道) 發出的呼叫。
-
在遠端呼叫之後,System.Transactions.Transaction.Current 傳回 null 值,而非遠端呼叫之前傳回的值。
因應措施
若要暫時略過這個問題,請嘗試下列任何方法:
-
對於每個啟用交易流程的交易範圍,請變更應用程式,以確保交易範圍為作用中時,所執行的程式碼中不會發出任何遠端呼叫。 當您判斷交易範圍是否包含任何遠端呼叫時,請考量下列方針:
-
對靜態方法的呼叫絕不是遠端呼叫。
-
若是對目標物件上執行個體方法的呼叫,只有當目標物件是 Transparent Proxy 時,才是遠端呼叫。
-
若是對建構函式的呼叫,只有當建構物件是 Transparent Proxy 時,才是遠端呼叫。
注意:您永遠可以使用 System.Runtime.Remoting.RemotingServices.IsTransparentProxy 方法來確認物件是否為 Transparent Proxy。
-
-
移除 TransactionScopeAsyncFlowOption.Enabled 建構函式引數,以停用交易流程。
警告
如果任何 "await" 作業在交易範圍為作用中時執行,此因應措施可能會造成其他錯誤。
-
Transaction.Current 屬性不會自動序列化為遠端呼叫, 而是必須以參數形式傳遞。 如果遠端呼叫未以參數形式傳遞交易,並且未在遠端呼叫期間對用戶端發出回呼,您可以在使用 TransactionScopeOptions.Suppress 選項的新 TransactionScope 物件內建立遠端呼叫。 在這個隱藏交易範圍內,Transaction.Current 屬性具有 null 值。
狀態
我們已知這個問題,目前正在研究解決方案。