我是.NET的新手,我遇到以下问题。我正在使用窗口身份验证的内部应用程序。 我需要创建一个临时对象,并在会话期间将其存储在数据库中。会话结束后,我不再需要该对象。
我在Session_start中创建了用于创建对象的代码,并在Session_end中创建了用于销毁它的代码。
protected void Session_Start(Object sender, EventArgs e)
{
MyDbContext db = new MyDbContext ();
MyObject o = new MyObject () { Temporary = 1 };
db.MyObjects.Add(o);
db.SaveChanges();
HttpContext.Current.Session.Add("my_object_id", o.ID);
}
protected void Session_End(Object sender, EventArgs e)
{
MyDbContext db = new MyDbContext ();
try
{
MyObject o = db.MyObjects.Find(HttpContext.Current.Session["my_object_id"]);
db.MyObjects.Remove(o);
db.SaveChanges();
}
catch (Exception)
{
//do nothing
}
}
我的配置文件中还有以下xml条目
<sessionState mode="InProc" timeout="30" />
我的问题是这些对象正在创建但从未被销毁过。目前,我们在开发服务器上托管我们的应用程序,并在Visual Studio内部iisexpress服务器本地运行它。
我将尝试添加某种日志记录,以查看是否正在调用session_end。此应用程序不具有任何类型的注销机制(具有Windows身份验证的内部应用程序)。
我不确定我是否正确行事。任何帮助,将不胜感激。
答案 0 :(得分:4)
确保应用程序池超时大于会话超时。否则,在调用Session_End
方法之前,应用程序池将被回收(如果您的站点没有多个访问者)。
您可以在此处找到设置:
http://bradkingsley.com/iis7-application-pool-idle-time-out-settings/