В последнее время я экспериментировал с объектами кэширования с HttpRuntime.Cache
, и я был вообще под впечатлением, что, если я «добавил» что-то в кэш, как это:ASP.NET: HttpRuntime.Cache становится красным при сохранении WebConfigurationManager - это ошибка?
HttpRuntime.Cache.Insert("Test", "This is a test!", null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(FileChanged));
, что «NotRemovable» и «NoExpiration» флаги сохраняли бы объект в памяти на время действия приложения. Но обнаружил, что в конце некоторых запросов страницы HttpRuntime.Cache будет полностью пустым!
Прослеживание и установка точки останова внутри моего обратного вызова «FileChanged» Я мог видеть, что действительно что-то «удаляло» мой объект (и каждый другой объект в кеше), но я не мог понять, почему. Поэтому, в конце концов, я начал отключать другие вещи, которые, как я думал, могут повлиять на эту подсистему.
В конце концов, я закомментировать строки:
WebConfigurationManager.OpenWebConfiguration("~").Save;
Я был в основном извлечения данных из «web.config» в регионе AppSettings, но время от времени писать обратно AppSettings и сохранения изменений, используя приведенную выше команду , Я знал, что, читая, что «web.config» кэшируется, но сохранение моих изменений обратно не должно очищать все HttpRuntime.Cache, правильно?
Это ошибка? Или два кэша каким-то образом связаны таким образом, что я должен быть осведомлен?
EDIT:
Хорошо, я сделал это супер воспроизводимым, если кто-то хочет попробовать это на своей собственной машине. (Я бегу VS2008 Pro ж/MVC2 таргетинга .NET 3.5) Просто запустите новый проект MVC2 и вставьте следующий код в HomeController
над любой уже есть:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Configuration;
using System.Configuration;
namespace BackButtonTest.Controllers
{
[HandleError]
public class HomeController : Controller
{
private string MESSAGE = "Message";
public ActionResult Index()
{
ViewData[MESSAGE] = HttpRuntime.Cache.Get(MESSAGE);
Configuration Config = WebConfigurationManager.OpenWebConfiguration("~");
Config.AppSettings.Settings.Add("SomeKey", "SomeValue");
Config.Save();
return View();
}
public ActionResult About()
{
HttpRuntime.Cache[MESSAGE] = "This is pulled from the HttpRuntime.Cache";
return View();
}
}
}
Затем выполните следующие действия:
- Запуск приложения в режиме отладки.
- Нажмите ссылку "О программе". Это загружает строку в кэш.
- Нажмите на ссылку «Главная». Строка вытягивается из кэша и застряла в словаре ViewMessage. Некоторая пара ключей/значений записывается в файл web.config и сохраняется. Строка из кеша должна появиться на главной странице.
- Нажмите ссылку «Главная» еще раз. Строка должна быть вытащена из кеша, но это не так.
- Остановить программу. Прокомментируйте 3 строки, начинающиеся с «Config». Перезагрузите программу.
- Повторите шаги с 1 по 4. Обратите внимание, что HttpRuntime.Cache не был опустошен.
Странно, да?
Wild. Я понятия не имел, что запись в web.config заново запустит приложение. – Pretzel