在使用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
对象获取其信息的位置的想法。那种在课堂上更有意义的东西。
答案 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”实例。或者,您也可以在构造中指定任何上述实例,这样可以使清理更少耦合。