我检查一个session
对象,如果它确实存在,则调用另一个间接使用该对象的方法。虽然第二种方法会在几纳秒内访问这个对象,但我想到的是当对象在两次调用之间准确到期时的情况。 Session
对象是否会在代码的每次读取访问中延长其生命周期以防止出现此类问题?如果不是如何解决问题?
如果你要说明为什么我没有将检索到的对象从第一个方法传递给第二个方法,这是因为我传递了ASP.NET Page
对象,其中包含许多其他参数到第二个方法如果我尝试分别传递它们,那么当我现在只传递一个Page
对象时会有很多参数。
答案 0 :(得分:1)
如果我理解你的情况,它就会这样:
您担心会话将在执行第一个和第二个方法/页面之间到期。
基本上这是不可能的,因为你的会话计时器在第一页开始处理之前时重置。因此,如果第一页有活动会话,那么您的第二页/方法也会有它(只要处理在20分钟之前完成 - 默认会话超时持续时间)。
会话通过HTTP模块进行处理,该模块在每个请求和页面开始处理之前运行。这解释了这种行为。如果您不熟悉HTTP模块,那么我建议您阅读一些关于IHttpModule interface。
的内容答案 1 :(得分:0)
很难理解你的问题,恕我直言,但我会尝试。
根据我的理解,你正在做类似的事情:
string helloWorld = string.Empty;
if (this.Session["myObject"] == null)
{
// The object was removed from the session or the session expired.
helloWorld = this.CreateNewMyObject();
}
else
{
// Session still exists.
helloWorld = this.Session["myObject"].ToString(); // <- What if the session expired just now?
}
或
// What if the session existed here...
if (this.Session["myObject"] == null)
{
this.Session["myObject"] = this.CreateNewMyObject();
}
// ... but expired just there?
string helloWorld = this.Session["myObject"].ToString();
我认为Session
对象由与页面请求相同的线程管理,这意味着检查对象是否存在是安全的,而不是在没有try / catch的情况下使用它。
我错了:
对于Cache对象,您必须知道您实际上处理的是跨多个线程访问的对象
来源:ASP.NET Cache and Session State Storage
我没有仔细阅读罗伯特·科里特尼克(Robert Koritnik)的回答,这实际上明确回答了这个问题。
事实上,您会收到有关在页面请求期间可能删除对象这一事实的警告。但由于Session
生命周期依赖于页面请求,这意味着只有在请求的时间超过会话超时时才必须考虑删除会话变量(请参阅如何处理会话)在Robert Koritnik的回答中。
当然,这种情况非常罕见。但是,如果在您的情况下,您非常确定页面请求可能需要超过20分钟(默认会话超时),而不是是,您必须考虑到在检查对象是否存在后可能会删除该对象,但是在你真正使用它之前。
在这种情况下,您显然可以增加会话超时,或在访问会话对象时使用try / catch。但恕我直言,如果页面请求需要几十分钟,你必须考虑其他替代方案,如Windows服务,来做这项工作。
答案 2 :(得分:0)
我很难理解这里的问题是什么,但让我再次尝试一下线程安全。
如果这是线程安全问题,您可以在创建某个会话对象时始终发出锁定,以便通过双重创建对象来解决其他并行请求。
if (obj == null)
{
lock (objLock)
{
if (obj == null)
{
obj = GenerateYourObject();
}
}
}
如果您之前从未使用过,请在MSDN上查看lock documentation。并且不要忘记检查其他网络资源。