0

我检查一个session对象,如果它确实存在,然后调用另一个间接使用该对象的方法。尽管第二种方法将在几纳秒内访问该对象,但我正在考虑对象在两次调用之间完全过期的情况。对象是否会Session在每次从代码读取访问时延长其生命周期以防止此类问题?如果不是如何解决问题?

如果您要说为什么我不将检索到的对象从第一个方法传递给第二个方法,这是因为我将Page带有许多其他参数的 ASP.NET 对象传递给第二个方法,并且如果我尝试传递每个方法它们分开,会有很多参数,而我Page现在只传递一个对象。

4

3 回答 3

1

别担心,这不会发生

如果我了解您的情况,它的工作原理是这样的:

  1. 访问某个页面
  2. 如果会话处于活动状态,它会立即重定向到第二页或在第一页上执行某个方法。
  3. 第二页/方法使用会话

您担心会话将在执行第一个和第二个方法/页面之间到期。

基本上这是不可能的,因为您的会话计时器在第一页开始处理之前被重置。因此,如果第一页有活动会话,那么您的第二页/方法也会有它(只要处理在 20 分钟之前完成 - 默认会话超时持续时间)。

Session是如何处理的

会话通过 HTTP 模块进行处理,该模块在每个请求上和页面开始处理之前运行。这解释了这种行为。如果您不熟悉 HTTP 模块,那么我建议您阅读一些有关IHttpModule 接口的内容。

于 2010-11-29T14:29:18.203 回答
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 的情况下使用它。

我错了:

对于缓存对象,您必须意识到您实际上是在处理跨多个线程访问的对象

来源:ASP.NET 缓存和会话状态存储

我没有仔细阅读 Robert Koritnik 的答案也是错误的,事实上,它清楚地回答了这个问题。

事实上,您会被警告在页面请求期间可能会删除对象。但是由于Session生命周期依赖于页面请求,这意味着只有当您的请求花费的时间超过会话超时时,您才必须考虑删除会话变量(请参阅 Robert Koritnik 的答案中的会话如何处理)。

当然,这种情况非常少见。但是,如果在您的情况下,您非常确定页面请求可能需要超过 20 分钟(默认会话超时),那么您必须考虑到在检查对象是否存在后可能会删除它,但是在你真正使用它之前。

在这种情况下,您显然可以增加会话超时,或者在访问会话对象时使用 try/catch。但是恕我直言,如果页面请求需要几十分钟,您必须考虑其他替代方案,如 Windows 服务来完成这项工作。

于 2010-11-29T14:51:09.347 回答
0

我很难理解这里的问题是什么,但让我再试一次,指的是线程安全。

线程安全问题

如果这是一个线程安全问题,您总是可以在创建某个会话对象时发出锁,这样其他并行请求就不会因为重复创建您的对象而遇到问题。

if (obj == null)
{
    lock (objLock)
    {
        if (obj == null)
        {
            obj = GenerateYourObject();
        }
    }
}

如果您以前从未使用过,请查看MSDN 上的锁定文档。并且不要忘记检查其他网络资源。

于 2010-11-29T16:06:11.897 回答