1

这与我不久前打开的一个问题半相关。ASP.NET Forms Authentication 模块的行为方式是它注册订阅app.AuthenticateRequestapp.EndRequestForms auth 劫持 EndRequest 的方式非常糟糕,并且是一个糟糕的设计决策,使 Forms Auth 扩展非常复杂。目前我有一个讨厌的实现,它阻止重定向做我想做的事。我从来没有对此感到满意,今天我突然想到查看这段代码有没有办法可以解开

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

我看到有关于如何从控件中删除所有事件处理程序的潜在相关答案,但这些答案的实现似乎差异很大,并且似乎它们可能只与Control继承者相关。

这个最重要的部分是删除 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 回答