2012-10-09 57 views
0

我想有一个“用户消息”可用于每个请求由服务器发回。如果没有用户消息,则消息将变回空白。如果有,则在请求完成后,在每个用户屏幕上激活一个图标。c#.net内存中的持久性

“用户消息”是由管理员为我正在部署的应用程序设置的。管理员可以在字段中输入文本,然后单击按钮将此消息发送给系统的其他用户。任何时候,其他用户执行任何类型的操作时,当前用户消息都会附加到JSON响应并由前端处理。

为了优化这个,我希望邮件被存储在内存(不在数据库中)

我试过使用静态。我试图使用HttpApplicationState。在这两种情况下,用户消息的值在一段时间后都会“消失”。经过一番研究,似乎静态和HttpApplicationState都受到IIS的约束,并且它决定回收应用程序池。 (或类似)

静态这个波动神秘:它应该是静态 - 只要IIS自己的生命,这个变量应该活。它不应该依赖某种“重置”或任何其他。 HttpApplicationState是我不完全理解的其他一些情况。

我想要一种方法来将值存储在我可以依赖的非易失性变量中。如果我今天设置了这个值,那么只要IIS未停止并重新启动,它应该在明天或下个星期。

任何帮助?


这里是我做了什么来解决这个问题按照下面的接受的答案:

  1. 用户消息是某个东西。因此当某个管理员设置了该消息时,将该响应存储在该时间点的数据库中,并将其存储在Application [“UserMessage”]对象中。
  2. 当来自用户的往返进入时,用户消息的内存中文本被添加到json返回值中。
  3. 消息可以随时由管理员清除,这将清除内存中的消息和数据库字段。
  4. 当IIS决定足够的时间并且回收应用程序时,Application_Start()方法(以及其他任务)也会将用户消息从设置了用户消息时存储的数据库值中重新排序(按照步骤1 )。

现在应用程序按预期工作。没有额外的价格支付到数据库为每个用户请求进入系统 - 用户消息总是来自内存。除此之外,数据库更新或加载用户消息的次数很少。

+0

看到我的回答,你可以使用application_start来恢复变量,如果它从内存中被销毁。这只发生在IIS回收您的应用程序时。 –

+0

谢谢喀布尔,我已根据您的回复更新了原始问题以阐明我的请求。抱歉的浑浊.. – horace

+0

你总是可以把消息放在应用程序缓存中,也可以放在数据库中。当第一次管理员发送消息时,你需要做的是把它放在数据库和应用程序缓存中。您的代码将始终从应用程序缓存中发送消息,但由于应用程序缓存将在应用程序重新启动后失效,因此您需要从application_start上的数据库中重新加载它。 –

回答

1

应用程序缓存是一个很好的地方。你的问题是,你认为你不能依靠它。请参阅我的答案的后面部分,在那里你会发现如何确保在iis重新启动或iis回收您的应用程序后,该值始终存在。

您可以将值存储在应用程序缓存中。这是可以做到如下

Application.Add(name,object) 

稍后,您可以通过使用此代码

Application[name] 

它是这样工作会议,但唯一的区别在于它是应用广泛,所有的请求从每个请求检索所有用户都会得到它。当您第一次分配设置值时,将其存储在数据库以及应用程序缓存中,以便稍后可以从数据库中进行查询并将其存储在应用程序缓存中(如果值不存在),然后从应用程序缓存中检索它。

您应该从每次应用程序启动或重新启动时触发的Application_Start()事件的数据库中恢复应用程序缓存。这样你可以确保它总是在应用程序缓存中。

+0

但该解决方案要求application_start()*知道*启动时的值。这个值是任意的。我原来的帖子并不完全清楚,所以我已经编辑澄清。 – horace

+0

如果你想在这个时候把价值放好,这取决于你。你能否澄清一下,你是什么意思的武断?在某个时间点,您必须知道将其存储在某处的价值。 –

+0

由任意,我的意思是任意的。有人坐在应用程序中,键入一个值,它以某种方式存储在服务器上 - 希望在内存中。该值不是在application_start()中预先确定的,而是在该时间点之后的某个时间动态生成的。请参阅下面的答案,了解如何使用持久性和应用程序对象来解决问题。 – horace

1

我想要一种方法将值存储在一个非易失性变量,我 可以依靠。如果我今天设置这个值,那么明天应该在那里, 或下周,只要IIS没有停止并重新启动。

在这种情况下,您不能将此值存储在内存中。内存是IIS为您分配的东西,用于承载应用程序的AppDomain。 IIS可以随时回收您的应用程序并清除内存。当IIS继续运行时,您的应用程序不会运行。所以你不能依靠它。在这种情况下,唯一可靠的解决方案是将这些信息保存在一些非易失性存储中,例如文件,数据库等......这个选择真的取决于您,但它应该超出您AppDomain的过程。

+0

后续问题:有什么方法可以知道iis即将回收我的应用程序吗?我不想这样做,但这是我不想打数据库.. – horace

+0

不,没有办法。 IIS可以随时回收您的应用程序。例如,如果您的应用程序遇到一些CPU或内存使用阈值。唯一可靠的解决方案是进程外持久性。 –