在HttpApplication上删除单个特定的无主事件订阅

时间:2013-01-28 15:02:19

标签: c# asp.net reflection event-handling

这与question I opened a while ago半关联。 ASP.NET Forms Authentication模块的行为方式是它注册了app.AuthenticateRequestapp.EndRequest的订阅形式auth劫持的方式EndRequest是非常糟糕的方式,并且是一个糟糕的设计决策使得Forms Auth极其复杂。目前我有一个讨厌的实现,阻止重定向来做我想要的事情。我从来没有对此感到满意,今天发现随机的想法,回顾这段代码是否有一种我可以解开的方式

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

我看到How to remove all event handlers from a control上有可能相关的答案,但这些答案的实现似乎变化很大,看起来它们可能只与Control个继承者相关。

这个最重要的部分是删除1个特定的事件订阅,而不是删除毯子。我想任何可以获得订阅的解决方案,将它们全部核对,然后允许我重新订阅其他所有订阅同样有效。

1 个答案:

答案 0 :(得分: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;
}