在Session_End期间访问HttpApplicationState

时间:2008-10-05 04:52:14

标签: asp.net application-state

在使用InProc会话的ASP.NET应用程序中,Session_End在另一个对象中调用静态方法来执行特定于会话的清理。此清理使用我在应用程序状态中存储的共享数据库连接。

问题是我看不到如何在不将它(或者说数据库连接)作为参数传递给清理方法的情况下访问应用程序状态。由于我不在请求中,因此我没有当前的HttpContext,并且我找不到任何其他静态方法来访问该状态。

我错过了什么吗?

更新:我的问题似乎需要进一步澄清,所以让我试试下面的代码示例。我希望能做的是:

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp();
}

但问题是CleanUp方法又需要存储在应用程序状态中的信息。我已经在做了以下事情,但这正是我希望避免的;这就是我所说的“......不通过它......作为清理方法的参数”。

// in Global.asax
void Session_End(object sender, EventArgs e) 
{
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup;
    nc.CleanUp(this.Application);
}

我只是不喜欢Global.asax 知道NeedsCleanup对象获取其信息的位置的想法。那种在课堂上更有意义的东西。

3 个答案:

答案 0 :(得分:3)

您应该能够使用Session_End内的Application属性访问ApplicationState对象。

void Session_End(object sender, EventArgs e) 
{
     HttpApplicationState state = this.Application;
}

(必须以不同的答案回复,因为我没有直接评论所需的声誉)

答案 1 :(得分:1)

您应该能够使用Session_End内的Session属性访问SessionState对象。

void Session_End(object sender, EventArgs e) 
{
    HttpSessionState session = this.Session;
}

此属性以及更多来自Global.asax的基类

答案 2 :(得分:0)

您在哪里创建“NeedsCleanup”实例?如果它在Session_Start中,那么您的全局类将知道如何/何时创建和销毁这些实例是有意义的。

我知道你想要将NeedsCleanup的清理与其调用者分离。也许更简洁的方法是通过“this”引用传递“HttpContext.Current.ApplicationInstance”和“Global”类中的“HttpApplication”实例。或者,您也可以在构造中指定任何上述实例,这样可以使清理更少耦合。