IHttpModule中的“请求在此上下文中不可用”

时间:2010-08-11 15:38:02

标签: .net iis-7 webrequest ihttpmodule

当我尝试访问HttpContext.Current.Request对象时,我收到了异常。

我在l1l2l3看到了回复......所以...我的问题是:

现在世界上有什么IHttpModules用于?

我想开发一个模块,每次呼叫进入可能的网站时都会被点击,所以我可以记录访问的网址,用户的IP地址等...,但现在看来我在IIS7中不能再这样做了。有没有解决方法? (除了切换到“经典模式”)。

alt text http://userserve-ak.last.fm/serve/126/24432467.jpg

干杯。

2 个答案:

答案 0 :(得分:4)

你什么时候做的?它是在模块事件中吗? 在综合游泳池中也应该是完美可行的。 最后,在集成模式下运行时,ASP.NET挂钩到IIS的方式发生了变化,使其“更加一流”。这确实意味着某些事件之前会触发,例如Application_Start现在将在实际请求的上下文之外触发。其他示例期望在BeginRequest中具有Windows身份验证身份,因为现在甚至在IIS身份验证之前就会发生BeginRequest,这在过去并非如此。

如果您的应用程序依赖于旧的不良行为,您仍然可以将AppPool更改为在经典模式下运行,它可以正常工作。

您应该能够在任何请求特定的通知中获取请求,例如BeginRequest,EndRequest,PostAuthorizeRequest等。 另外,我建议不要使用HttpContext.Current,因为这会在哈希表中产生额外的查找,通常你可以通过其他方式直接获取上下文,特别是在模块的上下文中,例如,如果你处理BeginRequest,你应该能够做到:

    HttpApplication application = (HttpApplication)sender;  
    HttpContext context = application.Context;  

您将保存查找。

根据你的描述,听起来你应该实现一个处理BeginRequest和EndRequest的模块,你应该没问题。

答案 1 :(得分:0)

我最初发布此评论是因为它不是一个真正的答案,但后来我看到你正在寻找一个“解决方案”,所以这是我对解决方案的想法。

<强> /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

<强> /Default.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类,以便激活它。