IHttpModule 中的“请求在此上下文中不可用”
-
27-09-2019 - |
题
当我尝试访问 HttpContext.Current.Request 对象时,出现该异常。
我已经看到了以下回复 l1, l2 和 l3 ...所以...我的问题是:
IHttpModule 现在到底有什么用?
我想开发一个模块,每次调用进入可能的网站时都会被命中,这样我就可以记录访问的 url、用户 IP 地址等......,但现在看来我不能再在IIS7中这样做了。有什么解决方法吗?(除了切换到“经典模式”)。
替代文本 http://userserve-ak.last.fm/serve/126/24432467.jpg
干杯。
解决方案
你什么时候这样做?是在模块事件中吗?它在集成池中也应该是完全可行的。最重要的是,在集成模式下运行时 ASP.NET 与 IIS 挂钩的方式发生了变化,这使得它“更加一流”。这确实意味着某些事件之前会触发,例如 Application_Start 现在将在实际请求的上下文之外触发。其他示例期望在 BeginRequest 中具有 Windows 身份验证身份,因为现在 BeginRequest 甚至在 IIS 身份验证之前发生,而过去的情况并非如此。
如果您的应用程序依赖于旧的不良行为,您仍然可以将 AppPool 更改为在经典模式下运行,并且它会正常工作。
您应该能够在任何特定于请求的通知中获取请求,例如 BeginRequest、EndRequest、PostAuthorizeRequest 等。另外,我建议不要使用 HttpContext.Current,因为这会在哈希表中进行额外的查找,并且通常您可以通过其他方式直接获取上下文,特别是在模块的上下文中,例如,如果您处理 BeginRequest,你应该能够做到:
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
您将保存查找。
从您的描述来看,您似乎应该实现一个处理 BeginRequest 和 EndRequest 的模块,并且应该没问题。
其他提示
我最初将其发布为评论,因为它并不是真正的答案,但后来我看到您正在寻找“解决方法”,所以这是我的解决方法的想法。
/App_Code/BasePage.vb
Public Class BasePage : Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
''# Do all your logging here
End Sub
End Class
/默认.aspx.vb
Partial Class _Default : Inherits BasePage
''# This is simply your code behind for each page (notice it inherits BasePage)
''# You can still have your Page_Load events along with custom methods in here,
''# and it will not affect the logging portion of your app.
End Class
基本上,您正在做的是创建一个类,无论正在加载什么页面,它都会在每个页面加载上执行相同的工作。然后应用程序中的每个页面都会继承自 BasePage
类以激活它。