2010-09-14 70 views
11

我的问题是相似但不完全相同:HttpModule.Init - 安全地添加HttpApplication.BeginRequest处理器在IIS7集成模式

Why can't my host (softsyshosting.com) support BeginRequest and EndRequest event handlers?(我也看到了mvolo博客中引用文献)

的目标是成功地钩HttpApplication.BeginRequest在IHttpModule.Init事件(或任何地方内部的模块),使用通常的HTTP模块经由system.webServer配置集成,即一个不:

  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 

注释掉app.BeginRequest += new EventHandler(this.OnBeginRequest)在初始化过程中停止的除外。 Init根本没有引用Context或Request对象。

我曾尝试:

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

任何人都知道一个好方法吗?有没有一些间接的策略来挂钩Application_Start(看起来不太可能)? a)可以从模块的构造函数或Init方法中挂钩的另一个事件,以及b)随后是安全地附加BeginRequest事件处理程序的另一个事件?

感谢很多

回答

3

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

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

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

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

+2

(HttpApplication的应用程序)',我称之为'app.BeginRequest + =新的EventHandler(this.OnApplication_BeginRequest)'。然后,我使用类级静态布尔_initted来防止多次添加处理程序。这就是为什么这种情况让我感到不安的原因。 – 2010-09-14 21:21:48

+0

这里同样的问题。我也发布到IIS站点上的一个主题,希望微软的某个人可能会有一个答案:http://forums.iis.net/p/1164977/1972908.aspx – 2011-02-24 01:03:14

+0

任何解决方案? 我可以添加一个httpModule到任何ASP.NET应用程序。但是,当试图将IHttpModule添加到SharePoint 2013站点(基于.NET 4.0)时,我得到完全相同的错误。一旦附加到BeginRequest事件,就会发生该问题。 – lapsus 2013-09-19 13:12:53

1

我有上述相同的问题。我发现一个实际的工作是总是删除然后添加处理程序。因此:

public override void Init() 
    { 
     base.Init(); 

     lock (_initialisationLockObject) 
     { 
      BeginRequest -= Global_BeginRequest; 
      BeginRequest += Global_BeginRequest; 
     } 
    } 

我怀疑事件处理程序在一次或多次对init的多次调用后被清除。如果你仔细地尝试第一次添加事件处理程序,后来被调用的时间不会添加事件,因此处理程序根本就不会被调用。如果你没有尝试任何狡猾的手段来限制事件被添加的次数,那么你看到获得多个附件。 通过首先尝试删除,然后添加(锁定内停止任何粗糙的竞争条件)似乎做的伎俩。

虽然是可怕的,我们不应该这样做!

希望在'空IHttpModule.Init帮助

+0

在我的情况下,我只需要做一些事情:System.Web.HttpContext.Current.ApplicationInstance.BeginRequest + = ApplicationInstance_BeginRequest;但它会抛出一个空指针异常+ = - =工作的工作区 – orellabac 2016-03-12 00:00:56