C# .net постоянство в памяти
Я хотел бы, чтобы "пользовательское сообщение" было доступно для каждого запроса, отправленного обратно сервером. Если пользовательское сообщение отсутствует, оно возвращается пустым. Если он есть, значок активируется на каждом пользовательском экране после выполнения запроса.
[править] "Пользовательское сообщение" - это то, что настраивается администратором для приложения, которое я развертываю. Администратор может ввести текст в поле и нажать кнопку, чтобы отправить это сообщение всем другим пользователям системы. Каждый раз, когда другой пользователь выполняет какое-либо действие, сообщение текущего пользователя присоединяется к ответу JSON и обрабатывается внешним интерфейсом.
Чтобы оптимизировать это, я хочу, чтобы сообщение было сохранено в памяти (не в базе данных).
Я пытался использовать статический. Я пытался использовать HttpApplicationState. В обоих случаях значение пользовательского сообщения "исчезает" через некоторое время. После некоторых исследований выясняется, что как статика, так и HttpApplicationState являются объектом IIS и когда он решает перезапустить пул приложений. (или некоторые такие)
Эта нестабильность статики таинственна: она должна быть статичной - до тех пор, пока существует сам IIS, эта переменная должна существовать. Он не должен зависеть от какого-то "сброса" или чего-то еще. HttpApplicationState - это еще одна ситуация, которую я не до конца понимаю.
Я хотел бы, чтобы сохранить значение в энергонезависимой переменной, на которую я могу положиться. Если я установлю это значение сегодня, оно должно быть там завтра или на следующей неделе, пока IIS не будет остановлен и перезапущен.
Любая помощь?
вот что я сделал, чтобы решить проблему в соответствии с принятым ответом ниже:
- пользовательское сообщение - вещь временная. поэтому, когда сообщение устанавливается каким-либо администратором, сохраните ответ в базе данных в этот момент времени и сохраните его в объекте Application["UserMessage"].
- когда поступают сообщения от пользователей, текст сообщения пользователя в памяти добавляется к возвращаемому значению json.
- сообщение может быть удалено администратором в любое время, что очищает как сообщение в памяти, так и поле базы данных.
- когда IIS решит, что достаточно, и перезапустит приложение, метод Application_Start() (среди прочих задач) также повторно запустит пользовательское сообщение из значения базы данных, которое было сохранено, когда пользовательское сообщение было установлено (согласно шагу 1).
теперь приложение работает как положено. при каждом обращении пользователя в систему дополнительная база данных не платится - пользовательское сообщение всегда приходит из памяти. в дополнение к этому, база данных обновляется или загружается для сообщения пользователя очень мало раз.
2 ответа
Кэш приложений - хорошее место для этого. Проблема для вас в том, что вы думаете, что не можете на это положиться. Пожалуйста, смотрите в последней части моего ответа, где вы найдете, как убедиться, что значение всегда там, даже если после перезапуска iis или iis перезапускает ваше приложение.
Вы можете сохранить значение в кеше приложения. Это можно сделать следующим образом
Application.Add(name,object)
Позже вы можете получить его в каждом запросе, используя этот код
Application[name]
Он работает как сеанс, но единственное отличие состоит в том, что он распространяется на приложение, и все запросы от всех пользователей получат его. При первом назначении задайте значение, сохраните его в дБ, а также в кеше приложения, чтобы впоследствии можно было сделать запрос из дБ и сохранить его в кеше приложения, если значение отсутствует, а затем извлечь его из кеша приложения.
Вам следует восстановить кеш приложения из базы данных на Application_Start()
событие, которое срабатывает каждый раз, когда приложение запускается или перезапускается. Таким образом, вы можете убедиться, что он всегда находится в кэше приложения.
Я хотел бы, чтобы сохранить значение в энергонезависимой переменной, на которую я могу положиться. Если я установлю это значение сегодня, оно должно быть там завтра или на следующей неделе, пока IIS не будет остановлен и перезапущен.
В этом случае вы не можете сохранить это значение в памяти. Память - это то, что IIS выделяет вам для размещения домена приложения вашего приложения. IIS может перезапустить ваше приложение в любое время и стереть память. Пока IIS продолжает жить, ваше приложение не работает. Таким образом, вы не можете положиться на это. Единственное надежное решение в этом случае - сохранить эту информацию в некотором энергонезависимом хранилище, таком как файл, база данных,... выбор действительно за вами, но он должен быть вне процесса вашего AppDomain.