1

これは、私が少し前に開いた質問に部分的に関連しています。ASP.NET フォーム認証モジュールが動作する方法は、サブスクリプションを登録し、app.AuthenticateRequestフォームapp.EndRequest認証が EndRequest をハイジャックする方法は非常にマナーが悪く、フォーム認証の拡張が非常に複雑になる不適切な設計上の決定でした。現在、リダイレクトを阻止して、代わりにやりたいことを行う厄介な実装があります。私はこれに満足したことは一度もありません。今日、このコードをレビューしているランダムな考えが思い浮かびました。フックを外す方法はありますか

app.EndRequest += new EventHandler(this.OnLeave);

コントロールからすべてのイベント ハンドラーを削除する方法に関する潜在的に関連する回答があることがわかりますが、これらの回答の実装は大きく異なり、Control継承者にのみ関連する可能性があるようです。

この最も重要な部分は、ブランケット nuking ではなく、1 つの特定のイベント サブスクリプションを削除することです。サブスクリプションを取得し、それらをすべて削除してから、他のすべてのサブスクリプションを再サブスクライブできるようにするソリューションも同様に有効であると思います。

4

1 に答える 1

0

このような何かがトリックを行う必要があります:

var formsModule = application.Modules.OfType<FormsAuthenticationModule>().FirstOrDefault();
if (formsModule != null)
{
   const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
   var method = typeof(FormsAuthenticationModule).GetMethod("OnLeave", flags);
   var handler = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), formsModule, method);
   application.EndRequest -= handler;
}
于 2013-01-28T17:52:12.937 に答える