0

在我使用 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对象从哪里获取信息的想法。那种在课堂上自成一体更有意义的事情。

4

3 回答 3

3

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

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

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

于 2008-10-06T05:06:47.443 回答
1

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

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

这个属性和更多属性来自 Global.asax 的基类

于 2008-10-05T05:18:40.040 回答
0

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

我了解您希望将 NeedsCleanup 的清理与其调用方分离。也许一种更简洁的方法是通过“this”引用传入“HttpContext.Current.ApplicationInstance”以及全局类中的“HttpApplication”实例。或者,您也可以在构造上指定任何上述实例,这将使清理的耦合度降低。

于 2008-10-07T04:38:43.363 回答