Мы, наконец, преобразовали наше VS 2008 решение .NET MVC в VS 2012 (yay!), Но обнаружили тревожную проблему. В веб-приложении заканчивается память. После многих часов расследования мы обнаружили следующее:Роли не освобождаются, приложение заканчивается из памяти
Пользовательский атрибут для наших контроллеров используется для проверки того, что у пользователя есть соответствующая роль для доступа к этой функции. Это выглядит следующим образом:
[ScreenAccessAuthorize(Roles = "RoleName.Access"), Prefs]
public class SampleController : SampleBaseController
Мы используем метод переопределения конкатенировать роль других возможных имен ролей для нашей системы. Это выглядит следующим образом:
public class ScreenAccessAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
...
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string r = "Admin," + Roles + ".Admin," + Roles + ".Access," + Roles;
Roles = r;
return base.AuthorizeCore(httpContext);
}
}
Там не было никаких проблем с этим кодом в проекте VS 2008 (таргетингом 3.5 Framework), но по какой-то причине, проект VS 2012 (нацеливание Framework 4.5) выполняется из памяти в функция переопределения.
При первом запуске атрибута (в 2012 году) значение для ролей - «RoleName.Access», а значение для r - «Admin, RoleName.Admin, RoleName.Access, RoleName.Access», но затем вызовы метода переопределения атрибута, похоже, объединяют значение Роли до тех пор, пока в приложении не будет памяти.
Дальнейшее расследование (в 2012 году) показало, что если мы изменим контроллеры, посетив другую страницу, значение Роли, похоже, будет сброшено, но если мы будем непрерывно выбирать функции, которые вызывают методы внутри одного контроллера, значение для ролей будет расти пока у нас не закончится память. Это какой-то странный вид кеширования в MVC4? Почему не значение для сброса ролей в атрибуте?
[ScreenAccessAuthorize(Roles = "RoleName.Access"),Prefs]
Мы видим, что Роли является собственностью System.Web.Mvc, которая имеет другой номер версии от MVC3 к MVC4, которая с той лишь разницей, что мы знаем.
Может кто-нибудь подумать, почему у нас возникает эта проблема?
Пожалуйста, дайте мне знать, если вам нужно больше объяснений.
Спасибо. Я реализовал конструктор в фильтре и явно предоставил этот параметр, но код конструктора выполнялся несколько раз для одного запроса и казался чрезмерным, хотя и предотвращал рост строки Roles и нехватка памяти. Затем я отключил кэширование экземпляров, как вы сказали. Это решение, похоже, работает намного лучше. Есть несколько фильтров, и строка ролей растет в каждом из них, поэтому отключение кэширования работает для всех. – codenewbie