如何在asp.net-mvc中连接Application_BeginRequest()
本文关键字:Application BeginRequest 连接 asp net-mvc | 更新日期: 2023-09-27 18:01:09
我在global.asax.cs
中从ASP.NET MVC项目中看到
protected void Application_BeginRequest()
{
}
但是当我尝试将它添加到我的项目中时,我看不出是什么在调用这个方法。我看到基本System.Web.HttpApplication
有这个事件,但我没有看到任何覆盖它或订阅这个事件的内容。
有人能解释一下如何在ASP.NET MVC中连接Application_BeginRequest
吗?
HttpApplication
类为您完成了这项工作。这里没有接口或覆盖;HttpApplication
使用反射将这些方法与基于方法名称的事件挂钩。因此,这是一种基于惯例的魔法,已经在框架中存在了一段时间。这很奇怪,我认为他们这样做只是为了保持与当年经典ASP的相似性,和/或提供一种避免编写大量小型HttpModule
的快捷方式。
对于好奇的人,在Reflector中加载HttpApplication
并查找HookupEventHandlersForApplicationAndModules()
方法。或者,加载HttpApplicationFactory
并查看ReflectOnApplicationType()
和ReflectOnMethodInfoIfItLooksLikeEventHandler()
(喜欢这个名称!(方法。
里克·斯特拉尔几年前在他的博客上讨论过这个问题。
使用ASP.NET确实需要了解这一点吗?不,但知道它肯定会解开一些谜团。
任何ASP.NET应用程序都是类型为的对象(或类(
public class Global : System.Web.HttpApplication
(你会在global.asax中找到这一点(
IIS调用的ASP.NET引擎创建对象的实例,HttpApplication接口要求Application_BeginRequest,它由IIS(通过ISAPI(调用
当ASP.NET引擎创建类的实例时,它看起来像这样:
HttpApplication thisAspApp = new YourASPApplication()
thisApplication.Begin_Request()
因为它将应用程序强制转换为派生类型,所以可以直接访问已知接口,而无需重写。虽然HttpApplication是一个类,但它通过强制转换的方式被用作接口。如果向类中添加新方法(或属性(,ASP.NET引擎将无法访问该方法,因为它只知道您的应用程序是通用HttpApplication。在VS中,如果你转到global.asax并右键单击类声明中的HttpApplication并选择"转到定义"(或按F12(,你可以看到基类的结构。(或者你可以在MSDN网上找到它(。