gpt4 book ai didi

c# - HttpModule.Init - 在 IIS7 集成模式下安全地添加 HttpApplication.BeginRequest 处理程序

转载 作者:可可西里 更新时间:2023-11-01 08:28:45 24 4
gpt4 key购买 nike

我的问题类似于但不完全相同:

Why can't my host (softsyshosting.com) support BeginRequest and EndRequest event handlers? (我还阅读了其中引用的 mvolo 博客)

目标是在 IHttpModule.Init 事件(或模块内部的任何地方)中成功 Hook HttpApplication.BeginRequest,使用通过 system.webServer 配置集成的普通 HttpModule,即不这样做的:

  1. 入侵 Global.asax 或
  2. 覆盖 HttpApplication(该模块旨在自包含和可重用,因此例如我有这样的配置):

    <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
    <remove name="TheHttpModule" />
    <add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" />

到目前为止,我尝试将监听器附加到 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

在 Init 中注释掉 app.BeginRequest += new EventHandler(this.OnBeginRequest) 当然会停止异常。 Init 根本不引用 Context 或 Request 对象。

我试过:

  • 删除了项目中任何地方对 HttpContext.Current 的所有引用(仍然是症状 1)
  • 测试从我的 OnBeginRequest 方法主体中删除所有代码,以确保问题不是方法内部的(= 异常)
  • 嗅探堆栈跟踪并仅在堆栈未由 InitializeApplication 启动(= BeginRequest 未触发)时调用 app.BeginRequest+=...
  • 仅在第二次通过 Init 时调用 app.BeginRequest+=(= BeginRequest 未触发)

有人知道好的方法吗?是否有一些间接策略可以在模块内挂接 Application_Start(似乎不太可能)?另一个事件,a) 可以从模块的构造函数或 Init 方法 Hook ,b) 随后是附加 BeginRequest 事件处理程序的安全位置?

非常感谢

最佳答案

您的 HttpModule 的 Init 方法将被单个 Web 应用程序调用多次(而您的 global.asax 中的 Application_Start 只会在每个 AppDomain 中被调用一次)。

Init 确实是挂接到 BeginRequest 的地方。

我也遇到过这个错误,它是由于多次挂接到 BeginRequest 事件引起的。我不确定这是否是 IIS 7 集成模式中的错误...

当您执行 app.BeginRequest 时,您是使用 IHttpModule 的 Init 方法的上下文参数调用 context.BeginRequest,还是调用 HttpContext.Current.BeginRequest += ...?

关于c# - HttpModule.Init - 在 IIS7 集成模式下安全地添加 HttpApplication.BeginRequest 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3712598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com