.NET Framework リモート処理でのイベントとデリゲート
このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。
.NET Framework リモート処理ではイベントとデリゲートを使用できますが、これらを適切に使用するには、2 つの主要な問題に対処する必要があります。特に、IpcChannel で認証を使用する場合にのみ、イベントとデリゲートを使用してください。
デリゲートの使用
リモート処理デリゲートでは、対処する必要があるセキュリティ上の問題が発生します。クライアントがサーバーにデリゲートを渡すと (クライアントがイベント ハンドラーをリモート イベントにアタッチするときに渡すのが最も一般的)、アタッチされたデリゲートは、サービスが意図したメソッドと同じシグネチャを持つ、認証されていないメソッドを参照することがあります。意図しないメソッドと意図したメソッドのシグネチャが一致するため、メソッドが静的メソッドであっても (したがって、リモート クライアントで呼び出すことはできません)、サービスは意図しないメソッドを呼び出す可能性があります。
この問題を軽減するには、サーバーはカスタム パラメーター型でデリゲートを定義する必要があり、その型を含むアセンブリが厳密な名前を持つ必要があります。さらに、このような通信は常に認証する必要があります (暗号化されていない場合)。意図した型であるかどうか不明な場合は、その型をサーバーで逆シリアル化することを許可しないでください。
イベントの使用
デリゲートに関するセキュリティ上の問題がある場合、イベントは使用しないことをお勧めします。代わりに、メソッドを公開するクライアント コールバック サービスを定義します。このメソッドは、サービスがクライアントと通信する必要がある場合に呼び出すことができます。前に説明したとおりにデリゲートを宣言している場合に、認証済みの IpcChannel でリモート イベントを使用するときは、クライアント イベント ハンドラーのメソッドを一方向の呼び出しにする必要があります。これは、イベントが発生すると、サーバーはイベント呼び出しリストのデリゲートを呼び出すためです。イベント処理システムは、クライアントが返すかタイムアウトするまで、その呼び出しをブロックします。そのため、イベント ハンドラーが一方向のメソッドでない場合、リッスンしていないクライアントによって単純なイベントのスループットが大幅に低下します。