我一整天都在网上搜索,但一无所获。 在我的web.config中,我设置了:
<modules runAllManagedModulesForAllRequests="false">
并且
<add name="MyModule" type="namespace.to.MyModule" preCondition="managedHandler" />
这会阻止MyModule(在此示例中挂钩到PostAuthenticateRequest)在静态资源(如images,css,js等)上触发。 但该模块仍然被页面内的.axd文件触发,特别是它是从WebResource.axd触发的
答案 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)。 无论如何,通过上面发布的解决方法,您也可以解决此问题。