你如何在asp.net-mvc中连接Application_BeginRequest()

时间:2011-07-06 01:16:56

标签: c# asp.net-mvc global-asax

我在asp.net-mvc项目的global.aspx.cs中看到了

 protected void Application_BeginRequest()
 {
 }

但是当我尝试将此添加到我的项目时,我看不到调用此方法的内容。我看到基础System.Web.HttpApplication有这个事件,但我没有看到任何覆盖它或订阅此事件。

有人可以解释你如何在asp.net-mvc中连接Application_BeginRequest吗?

2 个答案:

答案 0 :(得分:110)

我担心Cos的答案不太准确。您不必连接它,因为基础HttpApplication类为您完成。这里没有接口或覆盖; HttpApplication使用反射根据方法名称将这些方法连接到事件。所以这是基于会议的魔术,已经在框架中存在了一段时间。这很奇怪,我认为他们只是为了在当天保持与Classic ASP的相似性和/或提供一条捷径来避免编写大量小HttpModule

对于好奇,请在Reflector中加载HttpApplication并寻找HookupEventHandlersForApplicationAndModules()方法。或者,加载HttpApplicationFactory并查看ReflectOnApplicationType()ReflectOnMethodInfoIfItLooksLikeEventHandler()(喜欢该名称!)方法。

Rick Strahl discussed this on his blog a few years ago.

使用ASP.NET是否真的需要知道?不,但知道它肯定会消除一些神秘感。

答案 1 :(得分:3)

任何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并选择“Go To Definition”(或按F12),你可以看到基类的结构。 (或者你可以在MSDN网上找到它。)