1

我想为服务器发回的每个请求提供一个“用户消息”。如果没有用户消息,则消息返回空白。如果有,则在他们的请求完成后,每个用户屏幕上都会激活一个图标。

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

为了优化这一点,我希望将消息存储在内存中(而不是数据库中)。

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

静态变量的这种波动是神秘的:它应该是静态的——只要IIS本身存在,这个变量就应该存在。它不应该依赖于某种“重置”或其他什么。HttpApplicationState 是我不完全理解的其他一些情况。

我想要一种将值存储在我可以依赖的非易失性变量中的方法。如果我今天设置此值,它应该在明天或下周出现,只要IIS没有停止并重新启动。

有什么帮助吗?


这是我根据以下接受的答案为解决问题所做的工作:

  1. 用户消息是有时事。因此,当某个管理员设置消息时,将响应存储在该时间点的数据库中并将其存储在 Application["UserMessage"] 对象中。
  2. 当用户往返时,用户消息的内存文本被添加到 json 返回值中。
  3. 管理员可以随时清除该消息,这将清除内存中的消息和数据库字段。
  4. 当 IIS 认为足够了并回收应用程序时,Application_Start() 方法(以及其他任务)还将从设置用户消息时存储的数据库值中重新播种用户消息(按照步骤 1)。

现在应用程序按预期工作。对于进入系统的每个用户请求,无需支付额外的费用进入数据库 - 用户消息始终来自内存。除此之外,很少为用户消息更新或加载数据库。

4

2 回答 2

3

应用程序缓存是它的好地方。你的问题是,你认为你不能依赖它。请参阅我答案的后面部分,您将在其中找到如何确保该值始终存在,即使在 iis 重新启动或 iis 回收您的应用程序之后也是如此。

您可以将值存储在应用程序缓存中。可以按如下方式完成

Application.Add(name,object)

稍后您可以使用此代码在每个请求中检索它

Application[name]

它像会话一样工作,但唯一的区别是它是应用程序范围的,所有用户的所有请求都会得到它。当您第一次分配设置值时,将其存储在 db 以及应用程序缓存中,以便您以后可以从 db 进行查询并将其存储在应用程序缓存中,如果值不存在,然后从应用程序缓存中检索它。

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

于 2012-10-09T14:46:37.153 回答
2

我想要一种将值存储在我可以依赖的非易失性变量中的方法。如果我今天设置此值,它应该在明天或下周出现,只要 IIS 没有停止并重新启动。

在这种情况下,您不能将此值存储在内存中。内存是 IIS 分配给您的,用于托管应用程序的 AppDomain。IIS 可以随时回收您的应用程序并清除内存。虽然 IIS 继续存在,但您的应用程序却没有。所以你不能依赖它。在这种情况下,唯一可靠的解决方案是将这些信息保存在一些非易失性存储中,例如文件、数据库……选择完全取决于您,但它应该不在您的 AppDomain 进程中。

于 2012-10-09T14:42:50.007 回答