С# .net сохранение в памяти

Я хотел бы, чтобы "пользовательское сообщение" было доступно для каждого запроса, отправляемого обратно сервером. Если пользовательского сообщения нет, сообщение остается пустым. Если он есть, значок активируется на экране каждого пользователя после того, как его запрос выполнен.

[править] «Сообщение пользователя» — это то, что настраивается администратором для приложения, которое я развертываю. Администратор может ввести текст в поле и нажать кнопку, чтобы отправить это сообщение всем остальным пользователям системы. Каждый раз, когда другой пользователь выполняет какое-либо действие, текущее пользовательское сообщение прикрепляется к ответу JSON и обрабатывается внешним интерфейсом.

Чтобы оптимизировать это, я хочу, чтобы сообщение сохранялось в памяти (а не в базе данных).

Я пытался использовать static. Я пытался использовать HttpApplicationState. В обоих случаях значение пользовательского сообщения «стирается» через некоторое время. После некоторых исследований выяснилось, что и статика, и HttpApplicationState зависят от IIS и когда он решает перезапустить пул приложений. (или что-то подобное)

Эта изменчивость static загадочна: она должна быть static — пока жив сам IIS, эта переменная должна жить. Это не должно зависеть от какой-то «перезагрузки» или чего-то еще. HttpApplicationState — это другая ситуация, которую я не совсем понимаю.

Мне нужен способ сохранить значение в энергонезависимой переменной, на которую я могу положиться. Если я установлю это значение сегодня, оно должно быть там завтра или на следующей неделе, если IIS не будет остановлен и перезапущен.

Любая помощь?


вот что я сделал, чтобы решить проблему в соответствии с принятым ответом ниже:

  1. пользовательское сообщение - это когда-то. поэтому, когда сообщение устанавливается каким-либо администратором, сохраните ответ в базе данных в этот момент времени и сохраните его в объекте Application["UserMessage"].
  2. когда приходят обращения от пользователей, текст в памяти для пользовательского сообщения добавляется к возвращаемому значению json.
  3. сообщение может быть очищено администратором в любое время, что очищает как сообщение в памяти, так и поле базы данных.
  4. когда IIS решит, что этого достаточно, и перезапустит приложение, метод Application_Start() (среди других задач) также повторно заполнит пользовательское сообщение из значения базы данных, которое было сохранено при установке пользовательского сообщения (согласно шагу 1).

теперь приложение работает как положено. за каждый запрос пользователя в систему не взимается дополнительная плата за обращение к базе данных - пользовательское сообщение всегда приходит из памяти. кроме того, база данных обновляется или загружается для пользовательского сообщения очень мало раз.


person horace    schedule 09.10.2012    source источник
comment
Смотрите мой ответ, вы можете использовать application_start для восстановления переменной, если она уничтожена из памяти. Это происходит только тогда, когда IIS перезапускает ваше приложение.   -  person Murtuza Kabul    schedule 09.10.2012
comment
спасибо, Кабул, я обновил исходный вопрос, чтобы уточнить свой запрос на основе вашего ответа. извините за сумбурность..   -  person horace    schedule 10.10.2012
comment
Вы всегда можете поместить сообщение в кэш приложения, а также в базу данных. Когда администратор впервые отправляет сообщение, вам нужно поместить его в базу данных, а также в кеш приложения. Ваш код всегда будет отправлять сообщение из кеша приложения, но поскольку кеш приложения станет недействительным после перезапуска приложения, вам необходимо перезагрузить его из базы данных на application_start.   -  person Murtuza Kabul    schedule 11.10.2012
comment
Я знаю, что есть довольно много вопросов по этой точной теме. это довольно хорошее решение и, надеюсь, поможет другим, у которых есть такая же проблема.   -  person horace    schedule 11.10.2012


Ответы (2)


Кэш приложения — хорошее место для него. Проблема для вас в том, что вы думаете, что не можете на это положиться. См. более позднюю часть моего ответа, где вы найдете, как убедиться, что значение всегда есть, даже если после перезапуска iis или повторного использования вашего приложения iis.

Вы можете сохранить значение в кеше приложения. Это можно сделать следующим образом

Application.Add(name,object)

Позже вы можете получить его в каждом запросе, используя этот код

Application[name]

Он работает как сеанс, но единственная разница в том, что он распространяется на все приложение, и все запросы от всех пользователей получат его. Когда вы впервые назначаете заданное значение, сохраните его в БД, а также в кеше приложения, чтобы позже вы могли сделать запрос из БД и сохранить его в кеше приложения, если значение отсутствует, а затем получить его из кеша приложения.

Вы должны восстановить кеш приложения из базы данных по событию Application_Start(), которое срабатывает каждый раз при запуске или перезапуске приложения. Таким образом, вы можете гарантировать, что он всегда находится в кеше приложения.

person Murtuza Kabul    schedule 09.10.2012
comment
но это решение требует, чтобы application_start() знал, какое значение имеет значение при запуске. это значение произвольно. Я не совсем ясно выразился в своем первоначальном посте, поэтому я отредактировал его, чтобы уточнить. - person horace; 10.10.2012
comment
Это зависит от вас, хотите ли вы поставить значение в это время или нет. Не могли бы вы уточнить, что вы подразумеваете под произвольным? В какой-то момент вам нужно будет знать значение, чтобы где-то его хранить. - person Murtuza Kabul; 11.10.2012
comment
под произвольным я подразумеваю произвольный. кто-то сидит за приложением, вводит значение, которое каким-то образом сохраняется на сервере - надеюсь, в памяти. значение не определяется заранее в application_start(), а генерируется динамически через некоторое время после этого момента времени. см. мой ответ ниже о том, как я использую и постоянство, и объект приложения для решения проблемы. - person horace; 11.10.2012
comment
спасибо за обновление вашего ответа. я отметил это как правильный ответ. надеюсь, мой другой ответ упадет. - person horace; 11.10.2012

Мне нужен способ сохранить значение в энергонезависимой переменной, на которую я могу положиться. Если я установлю это значение сегодня, оно должно быть там завтра или на следующей неделе, пока IIS не будет остановлен и перезапущен.

В этом случае вы не можете сохранить это значение в памяти. Память — это то, что выделяется IIS для размещения AppDomain вашего приложения. IIS может перезапустить ваше приложение в любое время и стереть память. Пока IIS продолжает работать, ваше приложение не работает. Так что полагаться на него нельзя. Единственным надежным решением в этом случае является сохранение этой информации в каком-либо энергонезависимом хранилище, таком как файл, база данных и т. д. Выбор действительно за вами, но он должен быть вне процесса вашего AppDomain.

person Darin Dimitrov    schedule 09.10.2012
comment
дополнительный вопрос: есть ли способ узнать, что iis собирается переработать мое приложение? я не хочу сходить с ума с этим, но это то, с чем я не хочу ударить по БД .. - person horace; 10.10.2012
comment
Нет, нет пути. IIS может перезапустить ваше приложение в любое время. Например, если ваше приложение достигает некоторых пороговых значений использования ЦП или памяти. Единственное надежное решение — сохранение вне процесса. - person Darin Dimitrov; 10.10.2012