Pau*_*ith 12 c# iis-7 httpmodule integrated-pipeline-mode
我的问题类似但不完全相同:
为什么我的主机(softsyshosting.com)不支持BeginRequest和EndRequest事件处理程序?(我也读过其中引用的mvolo博客)
目标是成功地在IHttpModule.Init事件(或模块内部的任何地方)中挂钩HttpApplication.BeginRequest,使用通过system.webServer配置集成的普通HttpModule,即不会:
覆盖HttpApplication(该模块旨在自包含和可重用,所以例如我有这样的配置):
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="TheHttpModule" />
<add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" />
Run Code Online (Sandbox Code Playgroud)到目前为止,我试图将一个监听器附加到HttpApplication.BeginRequest的任何策略都会产生以下两种情况之一:症状1是BeginRequest永远不会触发,或者症状2是所有托管请求都抛出以下异常,我不能从用户代码中捕获并处理它:
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +30
System.Web.PipelineStepManager.ResumeSteps(Exception error) +1112
System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +113
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +616
Run Code Online (Sandbox Code Playgroud)
app.BeginRequest += new EventHandler(this.OnBeginRequest)在Init中注释会停止例外.Init根本不引用Context或Request对象.
我试过了:
有人知道一个好方法吗?在模块中挂钩Application_Start是否存在一些间接策略(似乎不太可能)?另一个事件:a)可以从模块的构造函数或Init方法挂钩,以及b)随后是附加BeginRequest事件处理程序的安全位置?
非常感谢
您的 HttpModule 的 Init 方法将被单个 Web 应用程序多次调用(而 global.asax 中的 Application_Start 每个 AppDomain 只会被调用一次)。
Init 确实是挂接 BeginRequest 的地方。
我也遇到过这个错误,它是由多次挂钩 BeginRequest 事件引起的。我不确定这是否是 IIS 7 集成模式的错误...
当您执行 app.BeginRequest 时,您是使用 IHttpModule 的 Init 方法的 context 参数调用 context.BeginRequest 还是调用 HttpContext.Current.BeginRequest += ...?