如何在ASP.NET MVC中连接Application_BeginRequest()?

44

我在一个ASP.NET MVC项目的global.asax.cs中看到

 protected void Application_BeginRequest()
 {
 }

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

有人能解释一下在ASP.NET MVC中如何连接 Application_BeginRequest 吗?


2
有更多适用于MVC的选项。你想做什么? - SLaks
@SLaks - 我正在尝试使用 asp.net-mvc mini profiler http://code.google.com/p/mvc-mini-profiler/,我看到 Appplication_BeginRequest 被用作启动分析器的地方。 - leora
mvc5 .net 称其为 'global.asax.cs',顺便说一下。 - stackuser83
2
@stackuser83一直都是这样。那只是Leora的一个(可以理解的)打字错误。 - Adam Plocher
2个回答

110

恐怕Cos的回答并不是完全准确的。你不需要进行连线,因为基础的HttpApplication类会代替你完成这个过程。这里没有接口或重写;HttpApplication使用反射根据方法名将这些方法连接到事件上。因此,这是一种基于约定的魔法,已经在框架中存在了一段时间。这很奇怪,我认为他们只是为了维护与Classic ASP的相似之处以及提供一种避免编写许多小HttpModule的快捷方式。

对于好奇的人,可以在Reflector中加载HttpApplication并查找HookupEventHandlersForApplicationAndModules()方法。或者,加载HttpApplicationFactory并查看ReflectOnApplicationType()ReflectOnMethodInfoIfItLooksLikeEventHandler()(喜欢这个名称!)方法。

Rick Strahl 在几年前的博客中讨论了这个问题。

这是您真正需要了解以使用ASP.NET吗?不是必须的,但知道它肯定可以消除一些神秘感。


在ASP.NET中有很多类似这样的神奇方法。还记得Web Forms中的Page_LoadPage_Init吗? - Jalal

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,然后选择“转到定义”(或按F12),您可以查看基类的结构。(或者您可以在MSDN在线找到它)。

那么你不需要在这里使用override吗? - leora
@jfar,它们是两个不同的状态。当提到“应用程序”(在这种情况下,是一个“Web应用程序”)时,描述性代码(包含在global.asax中)是一个“类”,一旦应用程序在内存中实例化,它就是一个对象。根据读者所设想的应用程序处于哪种状态,术语“对象”或“类”都可能是适当的。 - Cos Callis
@cos 如果它是接口的实现,我们不是总是需要实现它吗? - Muhammad Adeel Zahid
1
-1. 阅读Nicholas Piasecki的答案,或者这个相关问题:https://dev59.com/ZWEi5IYBdhLWcg3wG45o - Sphinxxx
-1 抱歉,但该解释不正确,实际上会误导关于如何连接来自全局asax的事件。Nicholoas Piasecki正确回答了开放性问题。 - De Shan Baptiste
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接