В настоящее время у меня есть следующий ActionFilterAttribute в моем проекте MVC. Он отлично работает для первого запроса, но последующие запросы возвращают сообщение, которое размещается DbContext.MVC ActionFilterAttribute DbContext Disposed Solutions
public class PermissionFilter : ActionFilterAttribute
{
private readonly ApplicationGroupManager _groupManager = new ApplicationGroupManager();
private readonly ActionPermissionManager _permissionManager = new ActionPermissionManager();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
if (request.IsAjaxRequest())
{
#region Preventing caching of ajax request in IE browser
response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
response.Cache.SetValidUntilExpires(false);
response.Cache.SetCacheability(HttpCacheability.NoCache);
response.Cache.SetNoStore();
#endregion Preventing caching of ajax request in IE browser
}
var currentAreaName = filterContext.RequestContext.RouteData.DataTokens["area"];
var currentActionName = filterContext.ActionDescriptor.ActionName;
var currentControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var userId = HttpContext.Current.User.Identity.GetUserId<int>();
if (!_groupManager.UserHasAdministratorAccess(userId))
{
if (!_permissionManager.HasPermission((currentAreaName == null ? String.Empty : currentAreaName.ToString()), currentControllerName, currentActionName, userId))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
}
}
base.OnActionExecuting(filterContext);
}
}
Я прочитал достаточно, чтобы понять, что это проблема со следующим изменением, которое было введено в MVC3
отличий: В предыдущих версиях ASP.NET MVC, фильтры действий которые создают по запросу, за исключением нескольких случаев. Такое поведение никогда не было гарантированным поведением, а просто детальностью реализации и контрактом для фильтров было считать их безстоящими. В ASP.NET MVC 3, фильтры кэшируются более агрессивно. Поэтому любое настраиваемое действие фильтров, которые неправильно сохраняют состояние экземпляра, может быть нарушено.
Я не уверен, как лучше всего решить эту проблему. Я подумал о переносе моих двух личных полей readonly в часть OnActionExecuting, которая, как я считаю, решит проблему, но я беспокоюсь о многопоточности и, если будут проблемы с этой реализацией.
Кажется, многие люди обошли эту проблему, используя Castle Windsor или Ninject, но они находятся за пределами моего уровня знаний и даже после прохождения урока Windsor (https://github.com/castleproject/Windsor/blob/master/docs/mvc-tutorial-intro.md). Я не могу понять, что именно мне нужно делать.
В вашем случае использование Castle Windsor или Ninject похоже на попытку ударить по булавке молотом Тора. –