C# 在所有会话中存储变量

C# 在所有会话中存储变量,c#,asp.net,C#,Asp.net,我知道这可能是一项简单的任务,但我还没有找到一个好的例子来说明如何完成这项任务。在我的asp应用程序中,我有一个用户可以更新的文本框。我正在寻找一种方法,将此变量的值存储在一个中心位置,以便为任何访问该页面的用户将TextBox的Text属性设置为该变量。此外,此变量应该一直存在,直到其他用户更新它。 最坏的情况是,我可以创建一个数据库表来存储这个值并从中提取它,但我想象asp或IIS会内置此功能。您可能要查找的内容称为 您可以按如下方式使用它: Application["Message"] =

我知道这可能是一项简单的任务,但我还没有找到一个好的例子来说明如何完成这项任务。在我的asp应用程序中,我有一个用户可以更新的文本框。我正在寻找一种方法,将此变量的值存储在一个中心位置,以便为任何访问该页面的用户将TextBox的Text属性设置为该变量。此外,此变量应该一直存在,直到其他用户更新它。
最坏的情况是,我可以创建一个数据库表来存储这个值并从中提取它,但我想象asp或IIS会内置此功能。

您可能要查找的内容称为

您可以按如下方式使用它:

Application["Message"] = "Welcome to the Contoso site.";
Application.Lock();
//Do any code that modifies or retrieves a value from the collection here
Application['MyMessage'] = "MyMessage";
MyClass myObject = Application['MyObject'] as MyClass;
Application.UnLock(); //Make sure you unlock it, or you will be in for a world of hurt.
您甚至可以存储对象,例如列表:

Application["MyList"] = new List<string>();

List<string> myList = Application["MyList"] as List<string>;
myList.Add("Test");
应用程序状态为自由线程,这意味着 应用程序状态数据可以由多个线程同时访问。 因此,在更新应用程序时确保 状态数据,您可以通过包含内置 同步支持。可以使用“锁定”和“解锁”方法 通过只锁定一个用于写入的数据来确保数据的完整性 一次一个来源。您还可以降低并发的可能性 在中初始化应用程序状态值时出现的问题 Global.asax文件中的应用程序启动方法

阅读更多关于

可扩展性问题


正如John Saunders和Servy在评论中指出的,如果应用程序需要考虑缩放,就像在Web站点/云场景中,多个Web服务器一起运行您的应用程序,那么最好考虑使用数据库解决方案来维护持久性数据。然后,您可以独立于web服务器扩展数据库需求,它还可以处理一些并发问题。不过,在此场景中,您可能仍希望使用应用程序状态来缓存不经常更新的数据。

您可能要查找的内容称为

您可以按如下方式使用它:

Application["Message"] = "Welcome to the Contoso site.";
Application.Lock();
//Do any code that modifies or retrieves a value from the collection here
Application['MyMessage'] = "MyMessage";
MyClass myObject = Application['MyObject'] as MyClass;
Application.UnLock(); //Make sure you unlock it, or you will be in for a world of hurt.
您甚至可以存储对象,例如列表:

Application["MyList"] = new List<string>();

List<string> myList = Application["MyList"] as List<string>;
myList.Add("Test");
应用程序状态为自由线程,这意味着 应用程序状态数据可以由多个线程同时访问。 因此,在更新应用程序时确保 状态数据,您可以通过包含内置 同步支持。可以使用“锁定”和“解锁”方法 通过只锁定一个用于写入的数据来确保数据的完整性 一次一个来源。您还可以降低并发的可能性 在中初始化应用程序状态值时出现的问题 Global.asax文件中的应用程序启动方法

阅读更多关于

可扩展性问题


正如John Saunders和Servy在评论中指出的,如果应用程序需要考虑缩放,就像在Web站点/云场景中,多个Web服务器一起运行您的应用程序,那么最好考虑使用数据库解决方案来维护持久性数据。然后,您可以独立于web服务器扩展数据库需求,它还可以处理一些并发问题。不过,在这种情况下,您可能仍希望使用应用程序状态来缓存不经常更新的数据。

如果只有一台web服务器,则可以使用应用程序状态,但应用程序状态在web服务器场上不起作用。如果您的应用程序将在web场上运行,并且您的状态需要在多个web服务器之间共享,那么您应该使用集中式存储(DB)

若应用程序状态对您有效,请确保您并没有在更改应用程序对象之前锁定和解锁应用程序对象所需的竞争条件

Application.Lock();
Application["myMessage"] = newValue;
Application.UnLock();

若您只有一台web服务器,则可以使用应用程序状态,但应用程序状态在web服务器场上不起作用。如果您的应用程序将在web场上运行,并且您的状态需要在多个web服务器之间共享,那么您应该使用集中式存储(DB)

若应用程序状态对您有效,请确保您并没有在更改应用程序对象之前锁定和解锁应用程序对象所需的竞争条件

Application.Lock();
Application["myMessage"] = newValue;
Application.UnLock();

你要找的是“应用程序状态”。你要找的是一个数据库。这是这个问题的适当解决方案…您正在寻找的被称为“应用程序状态”。您在这里寻找的是一个数据库。这是解决这个问题的合适方法…嗯。这在web场上不会很好地工作。@johnsaunds他似乎没有表示他正在运行web场=]@crush问题是,通常很难预测应用程序将如何扩展。现在可能不是,但几年后很可能会是。@Servy不知道自己的目标是什么,一个数据库也可能是绝对多余的。有很多理由在应用程序状态下缓存内容,而不是在每个页面请求上不断地重新查询数据库。@crush Caching,谁说这是缓存?缓存是对应用程序状态的适当使用。其想法是,它不是数据的主要存储位置,它只是一个副本,以避免再次获取或计算数据的费用。如果您有一个服务器场,则其中的每台服务器都应该具有缓存的不同副本,只要您确保它们保持同步。OP没有指出他正在做的是缓存信息,事实上他指出的是相反的,这将是此数据的主要存储位置。Hmmm。这在web场上不会很好地工作。@johnsaunds他似乎没有表示他正在运行web场=]@crush问题是,通常很难预测应用程序将如何扩展。现在可能不是,但几年后很可能会是。@Servy不知道自己的目标是什么,一个数据库也可能是绝对多余的。有pl