【发布时间】:2012-10-09 14:40:03
【问题描述】:
我想为服务器发回的每个请求提供一条“用户消息”。如果没有用户消息,则消息返回空白。如果有,则在每个用户屏幕上在他们的请求完成后激活一个图标。
[编辑] “用户消息”是管理员为我正在部署的应用程序设置的内容。管理员可以在字段中输入文本并单击按钮以将此消息发送给系统的所有其他用户。每当其他用户执行任何类型的操作时,当前用户消息都会附加到 JSON 响应并由前端处理。
为了优化这一点,我希望将消息存储在内存中(而不是在数据库中)。
我尝试过使用静态。我曾尝试使用 HttpApplicationState。在这两种情况下,用户消息的值都会在一段时间后“消失”。经过一些研究,似乎静态和 HttpApplicationState 都受 IIS 的影响,并且当它决定回收应用程序池时。 (或类似的)
static 的这种波动性是神秘的:它应该是 static - 只要 IIS 本身存在,这个变量就应该存在。它不应该依赖于某种“重置”或其他任何东西。 HttpApplicationState 是我不完全理解的其他情况。
我想要一种将值存储在我可以依赖的非易失性变量中的方法。如果我今天设置此值,它应该在明天或下周出现,只要 IIS 没有停止并重新启动。
有什么帮助吗?
这是我根据以下接受的答案解决问题的方法:
- 用户消息有时会发生。因此,当某个管理员设置消息时,将响应存储在该时间点的数据库中,并将其存储在 Application["UserMessage"] 对象中。
- 当用户往返时,用户消息的内存文本被添加到 json 返回值中。
- 管理员可以随时清除消息,这会清除内存中的消息和数据库字段。
- 当 IIS 确定足够了并回收应用程序时,Application_Start() 方法(以及其他任务)还将从设置用户消息时存储的数据库值中重新播种用户消息(按照步骤 1 )。
现在应用程序按预期工作。对于每个进入系统的用户请求,无需为进入数据库支付额外的费用 - 用户消息始终来自内存。除此之外,数据库为用户消息更新或加载的次数很少。
【问题讨论】:
-
看我的回答,如果变量从内存中销毁,你可以使用 application_start 来恢复它。这只发生在 IIS 回收您的应用程序时。
-
感谢 kabul,我已根据您的回复更新了原始问题以澄清我的要求。对不起,泥泞..
-
您可以随时将消息放入应用程序缓存和数据库中。当管理员第一次发送消息时,您需要做的就是将它放入数据库以及应用程序缓存中。您的代码将始终从应用程序缓存中发送消息,但由于应用程序重新启动后应用程序缓存将失效,您需要在 application_start 上从数据库中重新加载它。
-
我知道关于这个确切的主题有很多问题。这是一个相当不错的解决方案,希望能帮助遇到同样问题的其他人。
标签: static non-volatile httpapplicationstate