当我尝试访问 HttpContext.Current.Request 对象时,出现该异常。

我已经看到了以下回复 l1, l2l3 ...所以...我的问题是:

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 类以激活它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top