如何在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吗?

如何在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网上找到它(。