現象

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 がコンストラクターに渡され、トランザクション フローが有効化されている。

  • これらのトランザクション スコープのいずれかがアクティブなときに、アプリケーションが 1 つまたは複数のリモート呼び出しを行う。 この場合のリモート呼び出しとは、サーバー オブジェクトに到達する前に透過型プロキシを経由する任意の呼び出しです。   リモート呼び出しの例には、他のアプリケーション ドメインの呼び出しや、System.Runtime.Remoting.Channels 名前空間で定義されているクライアント チャネルなど、リモート チャネルを介して行われる呼び出しなどがあります。

  • リモート呼び出しの後、System.Transactions.Transaction.Current から、リモート呼び出しの前に返された値ではなく、null 値が返される。

回避策

この問題を回避するには、次のいずれかの方法を試してください。

  • トランザクション フローを有効にする各トランザクション スコープについて、トランザクション フローがアクティブな場合にコードのどこであってもリモート呼び出しが発生しないようにアプリケーションを変更します。 トランザクション スコープにリモート呼び出しが含まれているかどうかを判断する場合は、次のガイドラインを考慮します。

    • 静的メソッドの呼び出しは、リモート呼び出しにはなりません。

    • ターゲット オブジェクトに対するインスタンス メソッドの呼び出しの場合、ターゲット オブジェクトが透過型プロキシの場合にのみ、呼び出しはリモートになります。

    • コンストラクターの呼び出しの場合、構築されたオブジェクトが透過型プロキシの場合にのみ、呼び出しはリモートになります。

    注: System.Runtime.Remoting.RemotingServices.IsTransparentProxy メソッドを使用すると、いつでもオブジェクトが透過型プロキシかどうかを確認できます。

  • TransactionScopeAsyncFlowOption.Enabled コンストラクター引数を削除して、トランザクション フローを無効にします。 

    警告

    この回避策を実行した場合、トランザクション スコープがアクティブな間に "待機" 操作が実行されると、他のエラーが発生する可能性があります。

  • Transaction.Current プロパティは、自動的にリモート呼び出しにシリアル化されません。 これはパラメーターとして渡す必要があります。 リモート呼び出しでパラメーターとしてトランザクションが渡されず、リモート呼び出し中にクライアントに対するコールバックが実行されない場合、TransactionScopeOptions.Suppress オプションを使用する新しい TransactionScope オブジェクト内でリモート呼び出しを作成することができます。  この抑制トランザクション スコープ内で、Transaction.Current プロパティの値は null になります。

状態

マイクロソフトではこの問題を認識しており、解決に向けて取り組んでいます。

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?

ご意見をいただきありがとうございます。

×