0

in asp.net web application if I want to store variable in a static object is that right? I don't want that this object will share its value with another request.

public static object Objects
{
    get
    {
        if (HttpContext.Current.Items["Objects"] != null)
            return (object)HttpContext.Current.Items["Objects"];
        else
        {
            HttpContext.Current.Items["Objects"] = new object();
            return new object();
        }
    }

    set { HttpContext.Current.Items["Objects"] = value; }
}

THX

4

5 回答 5

3

静态字段在整个 AppDomain 中共享。这意味着 ASP.NET Web 应用程序中的所有请求都将使用相同的值,并且您必须确保该变量是线程安全的。如果这不是您想要的,请考虑以下事项:

  • 将值存储在用户会话中:HttpContext.Current.Session
  • 将值存储在请求中:HttpContext.Current.Items. 这样,该值会在整个当前请求中缓存,但不会在请求之间共享。
  • 根本不存储值。

但是,在您的情况下,您正在使用static属性。在您的情况下,此静态属性映射到HttpContext.Current.Items,这意味着每个请求都会自动获取自己的变量,并且变量不共享。

换句话说,您的代码是线程安全的。

于 2013-04-30T15:37:40.390 回答
1

如果您想使用静态变量而不在所有请求中共享它,您可以将会话变量存储在静态属性中。用于HttpContext.Session访问它。

public static object Objects  
{
    get
    {
        if (HttpContext.Current.Session["Objects"] != null)
            return (object)HttpContext.Current.Session["Objects"];
        else
        {
            var obj = new object();
            HttpContext.Current.Session["Objects"] = obj;
            return obj;
        }
    }

    set { HttpContext.Current.Session["Objects"] = value; }
}

但是,您不应该只返回object正确的类型,这将增加可读性,防止异常并避免始终将其转换到您使用它的地方。

于 2013-04-30T15:40:10.903 回答
1

我不希望这个对象与另一个请求共享它的值。

你不应该让它成为静态的。

于 2013-04-30T15:35:07.070 回答
0

有 4 个主要的服务器 Dictionary 对象在请求之间存储值。应用程序 - 在所有请求和用户之间共享值。缓存 - 在所有请求和用户之间共享值,但可以在不重新启动应用程序的情况下使其无效。会话 - 在同一会话中的请求之间共享值,所有页面共享相同的会话对象,并且是特定于用户的。ViewState - 在请求之间共享值,但特定于页面和特定于用户。

于 2013-04-30T19:54:37.637 回答
-2

如果您想在单个请求中使用静态的好处。也就是说,有一个请求可以访问相同的值。请改用会话变量。

Session['variable'] = value

这会将值存储在当前会话中,这样每个请求都会有不同的值。

于 2013-04-30T15:40:50.277 回答