現象
.NET Framework 4.6 に適用される 2018 年 7 月の.NET Frameworkセキュリティと品質のロールアップをインストールした後、 4.6.1、4.6.2、4.7、4.7.1、および 4.7.2 on Windows 7 Service Pack 1 (SP1)、Windows Server 2008 R2 SP1、または Windows Server 2008 SP2 では、.NET Frameworkでエラーが発生します次の条件を満たすアプリケーション:
- アプリケーションでは、TransactionScopeAsyncFlowOption.Enabled をコンストラクターに渡すことによってトランザクション フローが有効になっている System.Transaction.TransactionScope クラスのインスタンスを使用します。
- アプリケーションは、これらのトランザクション スコープのいずれかがアクティブな間に、1 つ以上のリモート呼び出しを行います。 この場合、リモート呼び出しは、サーバー オブジェクトに到達する前に透過的プロキシを経由する任意の呼び出しです。 リモート呼び出しの例としては、 System.Runtime.Remoting.Channels 名前空間で定義されているクライアント チャネルなど、他のアプリケーション ドメインへの呼び出しやリモート処理チャネルを介した呼び出しなどがあります。
- リモート呼び出しの後、 System.Transactions.Transaction.Current は、リモート呼び出しの前に返された値の代わりに null 値を返します。
回避策
この問題を回避するには、次のいずれかの方法を試してください。
トランザクション フローを有効にするトランザクション スコープごとに、トランザクション スコープがアクティブな間に実行されるコード内の任意の場所でリモート呼び出しが発生しないようにアプリケーションを変更します。 トランザクション スコープにリモート呼び出しが含まれているかどうかを判断する場合は、次のガイドラインを考慮してください。
- 静的メソッドの呼び出しは、リモート呼び出しではありません。
- ターゲット オブジェクトのインスタンス メソッドの呼び出しの場合、呼び出しは、ターゲット オブジェクトが透過的プロキシの場合にのみリモートです。
- コンストラクターの呼び出しの場合、呼び出しは、構築されたオブジェクトが透過的なプロキシである場合にのみリモートです。
メモオブジェクトが透過的なプロキシであるかどうかをチェックするには、常に System.Runtime.Remoting.RemotingServices.IsTransparentProxy メソッドを使用できます。
TransactionScopeAsyncFlowOption.Enabled コンストラクター引数を削除して、トランザクション フローを無効にします。
警告
この回避策は、トランザクション スコープがアクティブな間に "await" 操作が実行されると、他のエラーが発生する可能性があります。
Transaction.Current プロパティは、リモート呼び出しに自動的にシリアル化されません。 パラメーターとして渡す必要があります。 リモート呼び出しがトランザクションをパラメーターとして渡せず、リモート呼び出し中にクライアントにコールバックを行わない場合は、TransactionScopeOptions.Suppress オプションを使用する新しい TransactionScope オブジェクト内にリモート呼び出しを作成できます。 この抑制トランザクション スコープ内では、 Transaction.Current プロパティに null 値があります。
状態
この問題を認識しており、現在、解決に取り組んでいます。