2010-11-13 54 views
7

我必须面对的一个要求,如何在ASP.net web应用程序定义一个全局变量

我想客户端访问数据中心,但不使用数据库,所以我想我的web应用程序可以保留一个全球性或应用程序会话变量,包含数据,每个客户端都可以访问相同的数据...我试图在golabl中声明,但似乎只能存储字符串,但其他人...

如何解决这个问题?

谢谢。

+2

您是指会话变量在整个会话期间保持不变,还是会在客户端(其他会话)之间共享的变量保持不变? – KennyH 2010-11-13 05:28:57

+0

你可以分享你正在尝试使用的例子吗? – jcolebrand 2010-11-14 01:52:36

+0

另请参阅http://stackoverflow.com/questions/20347280/thread-safe-global-variable-in-an-asp-net-mvc-application – Tony 2016-04-16 15:41:55

回答

5

与所有应用程序的用户分享数据,你可以使用ASP.NET Application对象。鉴于是示例代码访问ASP.NET应用对象:

Hashtable htblGlobalValues = null; 

if (Application["GlobalValueKey"] != null) 
{ 
    htblGlobalValues = Application["GlobalValueKey"] as Hashtable; 
} 
else 
{ 
    htblGlobalValues = new Hashtable(); 
} 

htblGlobalValues.Add("Key1", "Value1"); 
htblGlobalValues.Add("Key2", "Value2"); 

this.Application["GlobalValueKey"] = htblGlobalValues; 

Application["GlobalValueKey"]可以在任何地方在任何用户整个应用程序中使用。这对所有的应用程序用户来说都很常见。

+3

请停止向您的帖子添加签名块。他们使它看起来像你试图给你的网站发送垃圾邮件。在您制作的每个帖子上都有一个链接,您的个人资料就是您的签名。你可以添加任何你喜欢的(在合理的范围内)到你的个人资料页面。这将是发布链接到您的博客,网站,侧边项目,业务等的地方。 – 2010-11-14 01:43:28

+0

好的,谢谢 – Sankalp 2010-11-16 07:09:43

+0

您可以对应用程序 – abatishchev 2011-02-25 14:59:08

11

另一个定义一个全局变量的选择是用一个静态属性创建一个静态类:

public static class GlobalVariables 
{ 
    public static string MyGlobalVariable { get; set; } 
} 

你可以让这个更复杂,如果你要使用这是一个数据存储,但同样的想法。也就是说,如果你有一本字典来存储您的全局数据,你可以做这样的事情:

public static class GlobalData 
{ 
    private static readonly object _syncRoot = new object(); 
    private static Dictionary<string, int> _data; 

    public static int GetItemsByTag(string tag) 
    { 
     lock (_syncRoot) 
     { 
      if (_data == null) 
       _data = LoadItemsByTag(); 

      return _data[tag]; 
     } 
    } 

    private static Dictionary<string, int> LoadItemsByTag() 
    { 
     var result = new Dictionary<string, int>(); 

     // Load the data from e.g. an XML file into the result object. 

     return result; 
    } 
} 
+2

静态数据仅在池中通用,如果某些池中有许多池那么他们是不同的。 – Aristos 2010-11-14 12:57:37

+0

@Aristos - 它在AppDomain中是静态的。这是否与池内相同? – 2010-11-14 13:00:48

+1

@Pieter不,静态只在池中相同。如果你有2个池,那么你有2个不同的静态值,并且如果一个用户使用两个非常可能的池,那么这个值是不同的。做一些测试,看你自己。 (你需要iis6 +) – Aristos 2010-11-15 13:20:21

0

您还可以使用Cache,它具有设置过期时间/日期的优点。