为啥事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件?
Posted
技术标签:
【中文标题】为啥事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件?【英文标题】:Why can event handlers only be bound to HttpApplication events during IHttpModule initialization?为什么事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件? 【发布时间】:2010-05-06 13:15:00 【问题描述】:这只是另一个“在开发服务器中工作,为什么不在 IIS 中工作”类型的问题。
我使用 NHibernate 作为described here 创建了一个不错的 DAL。创建 ISession 时,我将一个事件处理程序连接到 HttpApplication.EndRequest 以负责清理它。
但是,我将我的网站部署到 IIS,它说:
事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件。
我完全理解消息在说什么,但我无法理解为什么。
我可以随时订阅Button
的事件,为什么我不能订阅HttpApplication
的事件?
如果有人能对此有所了解,我将不胜感激。
我还想知道,为什么它可以与开发服务器而不是 IIS 7 一起工作?
编辑: 现在两个月过去了,我仍然没有收到任何有用的答案。 :( 这个问题真的那么难吗?
【问题讨论】:
【参考方案1】:您正在尝试在其初始化管道之外使用 HttpApplication。只是不要这样做。正如错误所说,在 IHttpModule 初始化期间绑定您的事件。
【讨论】:
我得到了这么多。我缺少的部分是为什么。 :) @downvoter:这真的错了吗?愿意解释一下为什么错了吗? 嗨。这没有错,但我投了反对票,因为这不是问题的答案:“为什么?” @Jan:嗯,原因是 ASP.NET 就是这样构建的。这就是它的设计方式。 @Mauricioscheffer 但是以这种方式构建 ASP.Net 的基本原理是什么?你没有回答 Venemo 的问题。【参考方案2】:因为 IIS7 对 HTTP 应用程序的启动方式有一些改变(基本上就是关联的工作进程及其 HTTP 应用程序)。
看看http://n2cms.codeplex.com/Thread/View.aspx?ThreadId=38311。
如果您在经典模式或集成模式下运行 IIS7,并在 web.config 中添加以下项目,它应该可以正常工作:
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
</configuration>
(截自http://code.google.com/p/n2cms/source/browse/trunk/src/wwwroot/Web.config)
【讨论】:
我已经有 validateIntegratedModeConfiguration="false" (MVC默认放在那里),但它不起作用。 此配置参数只影响配置验证。更改它只会防止在您的站点 conf 中发现 IIS 6 过时的配置参数时引发配置错误。验证配置后,它不会改变运行时行为。【参考方案3】:如果它确实在您的开发环境中工作,而不是在您的 IIS 上,那么您很可能(曾经?)使用 Cassini 开发服务器。该服务器的行为与 IIS 相差甚远。
另一种解决方案是改用 IIS Express,它在 Visual Studio 中提供与旧 Cassini 开发服务器相同级别的集成(至少从 2010 年开始),同时表现得更像 IIS。 IIS Express 在 Microsoft 网站上提供了一个独立的安装程序,并且还包含在最新版本的 Visual Studio 中。
这是你第一个问题行中的“为什么”。
至于为什么禁止在IHttpModule初始化之外绑定事件,我不知道。
【讨论】:
好的,但此页面上没有任何说明,否则我应该更换眼镜。因此,您的问题的第一个“为什么”在此页面上没有答案。 你还是没有回答“为什么”。以上是关于为啥事件处理程序只能在 IHttpModule 初始化期间绑定到 HttpApplication 事件?的主要内容,如果未能解决你的问题,请参考以下文章