在为[Authorize]Microsoft MVC版本4和5中的属性设置自定义主体时,我们需要进入Global.asax.cs并设置一个名为的方法Application_PostAuthenticateRequest().我已经在我当前的项目中完成了这项工作,并且工作正常.
然而,这真的让我觉得这看起来像"神奇"多少.Application_PostAuthenticateRequest()不是虚方法.我没有在类中重载或实现任何现有的方法签名.那么MVC框架如何知道它呢?毕竟,C#是一种强类型语言,除非你知道它在那里,否则你不能在类上调用方法.
我能看到的唯一方法就是通过Reflection.也许通过最终对象的方法并将任何与特定签名匹配的方法分配给委托.但我真的不知道.我不明白为什么设计师会这样做,而不仅仅是实现虚拟方法.
因此,总而言之,(A)Application_PostAuthenticateRequest当它不是global.asax类的已定义方法时,如何被调用,以及(B)为什么它们不只是使它成为虚方法?
Rick Strahl对此有详尽的文章。简而言之,运行时在全局应用程序类上使用反射。
http://weblog.west-wind.com/posts/2009/Jun/18/How-do-ASPNET-Application-Events-Work
这种事件接线通常称为“自动”,并且也出现在页面级别。例如,Page_Load之所以称为,是因为默认自动连线。