如何排除Webresource.axd触发我的自定义HttpModules

时间:2012-12-25 22:24:36

标签: asp.net httpmodule preconditions

我一整天都在网上搜索,但一无所获。 在我的web.config中,我设置了:

<modules runAllManagedModulesForAllRequests="false">

并且

<add name="MyModule" type="namespace.to.MyModule" preCondition="managedHandler" />

这会阻止MyModule(在此示例中挂钩到PostAuthenticateRequest)在静态资源(如images,css,js等)上触发。 但该模块仍然被页面内的.axd文件触发,特别是它是从WebResource.axd触发的

1 个答案:

答案 0 :(得分:0)

我在我的HttpModule中添加了这个检查,它可以工作:

            ' Skip the module for non aspx requests like .axd or url without default document
     Private Sub Application_PostAuthenticateRequest(ByVal source As Object, ByVal e As EventArgs)
        Dim request = DirectCast(source, HttpApplication).Request
        If request.CurrentExecutionFilePathExtension.ToLower <> ".aspx" Then
            Exit Sub
        End If

这与PostAuthenticateRequest挂钩。如果您挂钩其他事件,例如OnEndRequest,请注意您可以访问HttpContext而不是HttpApplication,所以请添加:

  Protected Overridable Sub OnEndRequest(context As HttpContext)          
  ' Skip the module for non aspx requests like .axd or url without default document
        Dim request = context.Request
        If request.CurrentExecutionFilePathExtension.ToLower <> ".aspx" Then
            Exit Sub
        End If

另请注意,在调用没有文档的URL时,例如http://www.yoursite.com IIS会触发对http://www.yoursite.com/Default.aspx(或您设置的任何def文档)的请求。 因此,即使您的页面为空,您也会触发2个请求。 IIS站点声明“对于默认文档请求,第一个请求是无扩展URL。因此,IIS不会运行任何在初始请求处理期间标记有托管处理程序前提条件的托管模块。” 但事实并非如此。即使我的HttpModule标记了属性precondition =“managedHandler”并且请求类似http://www.yoursite.com/,它仍然会被触发两次(一个用于/,一个用于/Default.asp)。 无论如何,通过上面发布的解决方法,您也可以解决此问题。