Запретить заполнение ASP.NET Cache многими URL-адресами MVC - PullRequest
6 голосов
/ 14 сентября 2009

Наш сайт использует ASP.NET MVC для части страниц в нем. Эти URL-адреса обычно имеют форму http://oursite/detail.mvc/12345/pictures/. В этом URL-адресе 12345 является идентификатором в базе данных. У нас есть несколько сотен тысяч объектов, для которых мы показываем страницы с подробностями. Недавно мы заметили рост использования памяти для сайта, поэтому я немного исследовал. Мы сделали дамп памяти производственного сайта и обнаружили, что значительный объем общего использования памяти был вызван строками в кэше в форме «dmachine / webroot / 1 / site / detail.mvc / 12345 / pictures /» и «H». : \ сайт \ detail.mvc \ 12345 \ картинками \»

.

Дальнейшие исследования и интенсивное использование Reflector показали, что эти строки хранятся в кэше ASP.NET в форме объекта System.Web.CachedPathData. Это создается ConfigurationManager при чтении информации из файла web.config. Он вызывает HttpContext.GetSection () -> HttpContext.GetConfigurationPathData () -> CachedPathData.GetVirtualPathData (). В конечном итоге в CachedPathData.GetConfigPathData определяется виртуальный путь для запрошенного пути, который кэшируется в кэше ASP.NET без истечения срока действия.

Теперь проблема в том, что у нас есть миллионы различных URL-адресов, и для каждого пути система конфигурации хранит ряд строк (configPath, виртуальный путь, физический путь) в кэше. Со временем эта информация занимает несколько сотен МБ, почти все данные в кеше.

Я предполагаю, что когда памяти станет мало, эти записи будут удалены, но в операциях они не доверяют процессам, которые растут и растут. Это также кажется очень неэффективным. Есть ли способ сказать HttpContext не кэшировать эту информацию для каждого уникального URL? Или, может быть, мы можем сначала сопоставить путь запроса с более простым URL и использовать его для выбора правильного web.config?

1 Ответ

1 голос
/ 14 сентября 2009

Ну, я подумал (мы с Теуном работаем в одной компании), и у нас есть два варианта, насколько я могу судить:

  1. Ничего не делать. Эта статья содержит комментарий от одного сотрудника команды asp.net и показывает несколько способов предотвратить рост и увеличение кэша: http://forums.asp.net/p/985551/3297967.aspx#3297967,, но не решает проблему записи записи в кэш для каждого возможного маршрутизации, но гарантирует, что кеш не выбрасывает некоторые исключения из памяти.

  2. Решите проблему с помощью обходного пути, используйте параметры строки запроса вместо фиксированных маршрутов (/controller.mvc?action=X&params=Y вместо controller.mvc / action / params). Таким образом, только controller.mvc кэшируется.

В конце концов, я не думаю, что это действительно проблема.

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