【问题标题】:How to define a global variable in ASP.net web app如何在 ASP.net Web 应用程序中定义全局变量
【发布时间】:2010-11-13 05:17:08
【问题描述】:

我有一个要求,

我希望客户端访问数据中心但不使用数据库,所以我希望我的 Web 应用程序可以保留包含数据的全局或应用程序会话变量,每个客户端都可以访问相同的数据...我尝试声明在 golabl 中,但似乎它只能存储 String 而其他...

如何解决这个问题?

谢谢。

【问题讨论】:

  • 您指的是在会话的整个生命周期中保持不变的会话变量还是将在客户端(其他会话)之间共享的变量?
  • 您能分享一下您尝试使用的示例吗?

标签: c# asp.net


【解决方案1】:

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

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;
    }
}

【讨论】:

  • 静态数据只在池内通用,有的池多则不同。
  • @Aristos - 在AppDomain 中是静态的。和游泳池里的一样吗?
  • @Pieter 没有静态仅在池内相同。如果您有 2 个池,那么您有 2 个不同的静态值,如果用户使用两个池,这是非常可能的,那么值是不同的。做一些测试,让你自己看看。 (你需要 iis6+)
  • @Aristos - 这很有趣。我很好奇游泳池和AppDomain 之间有什么区别。你知道这方面的一些文件吗?
  • @Pieter 看,池注意为一个网站运行一个 AppDomain。您可以在同一个池中拥有多个网站,并且同一网站有多个 AppDomain,每个池中的每个 AppDomain。所有没有连接在一起的东西。
【解决方案2】:

要与所有应用程序用户共享数据,您可以使用 ASP.NET 应用程序对象。给出的是在 ASP.NET 中访问 Application 对象的示例代码:

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"] 可以被任何用户在整个应用程序的任何地方使用。它对所有应用程序用户都是通用的。

【讨论】:

  • 请停止在您的帖子中添加签名块。它们使您看起来像是在尝试向您的网站发送垃圾邮件。您发布的每个帖子都有一个指向您的个人资料的链接,作为您的签名。您可以将您喜欢的任何内容(在合理范围内)添加到您的个人资料页面。那将是发布指向您的博客、网站、副项目、业务等的链接的地方。
  • 您对应用程序进行了过多的查找
  • -1 表示没有线程安全锁定。有关添加内容的示例,请参见@Pieter 的回答。不管是使用Application还是静态类,还是有必要的。
【解决方案3】:

如果需要,您可以将数据填充到 Application 对象中。它不是跨应用程序实例的持久性,但这可能就足够了。

(我暂时不会建议这是最佳实践,但如果没有更清晰的要求,我只能建议。)

http://msdn.microsoft.com/en-us/library/system.web.ui.page.application.aspx
http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx

【讨论】:

    【解决方案4】:

    如果您使用WebApplicationMVC,只需转到Global.asax(在网站项目中,您需要从添加新项目菜单中添加Global.asax)。
    我将解释为您的 Web 应用程序部署两个全局变量:
    打开Global.asax文件,然后在Application_Start函数中定义你的变量如下:

    void Application_Start(object sender, EventArgs e)
    {
       Application.Lock();
       Application["variable1"] = "Some Value for variable1";
       Application["variable2"] = "Some Value for variable2";
       Application.UnLock();
    }
    


    如果您想在 aspx 页面中使用这些全局变量,只需像这样调用它们:

    <p>I want to call variable1 <%=Application["variable1"].ToString() %></p>
    <p>I want to call variable1 <%=Application["variable2"].ToString() %></p>
    


    但是,如果您想在服务器端调用这些全局变量,如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
       string str1 = Application["variable1"].ToString();
       string str2 = Application["variable2"].ToString();
    }
    

    注意:您必须注意,这些全局变量对所有用户都是公开的,不适用于身份验证作业。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-14
        • 2022-12-18
        • 2011-05-31
        • 1970-01-01
        • 2019-07-05
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多