【问题标题】:how do you wire up Application_BeginRequest() in asp.net-mvc你如何在 asp.net-mvc 中连接 Application_BeginRequest()
【发布时间】:2011-09-29 06:05:56
【问题描述】:

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

 protected void Application_BeginRequest()
 {
 }

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

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

【问题讨论】:

  • 有更多 MVC 友好的选项。你想做什么?
  • @SLaks - 我正在尝试使用 asp.net-mvc 迷你分析器code.google.com/p/mvc-mini-profiler,我看到 Appplication_BeginRequest 被用作启动分析器的地方
  • mvc5 .net 将其称为“global.asax.cs”fwiw
  • @stackuser83 一直都是。这只是 leora 的一个(可以理解的)错字。

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


【解决方案1】:

恐怕 Cos 的回答不太准确。您不必将其连接起来,因为基本 HttpApplication 类会为您完成。这里没有接口或覆盖; HttpApplication 使用反射将这些方法与基于方法名称的事件挂钩。所以它是一种基于约定的魔法,已经在框架中存在了一段时间。这很奇怪,我认为他们这样做只是为了保持与过去经典 ASP 的相似性和/或提供一种快捷方式来避免写很多小的HttpModules。

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

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

使用 ASP.NET 真的需要了解这些知识吗?不,但知道它肯定会消除一些谜团。

【讨论】:

  • 在 ASP.NET 中有很多这样的魔术方法。还记得 Web 表单中的 Page_LoadPage_Init 吗?
【解决方案2】:

任何 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 online 中找到它)。

【讨论】:

  • 所以你不需要在这里覆盖吗?
  • 这里的挑剔者,类和对象不是可互换的词。 ;)
  • @jfar,它们是两种不同的状态。当提到“应用程序”(在本例中为“网络应用程序”)时,描述性代码(包含在 global.asax 中)是一个“类”,一旦应用程序在内存中被实例化,它就是一个东西。根据读者对应用程序的设想,术语对象或类可能是合适的。
  • @cos 如果它是接口的实现,我们不总是必须实现它吗?
  • -1。阅读 Nicholas Piasecki 的回答或相关问题:stackoverflow.com/questions/21646605/…
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多