현재 MVC 프로젝트에 다음 ActionFilterAttribute가 있습니다. 첫 번째 요청에 대해서는 정상적으로 작동하지만 후속 요청에서는 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에서는 필터가보다 적극적으로 캐시됩니다. 따라서 인스턴스 상태를 부적절하게 저장하는 모든 사용자 지정 동작 필터가 손상 될 수 있습니다.
이 문제를 해결하는 가장 좋은 방법이 확실하지 않습니다. 두 개의 개인 읽기 전용 필드를 OnActionExecuting 조각으로 이동하여이 문제를 해결할 수 있다고 생각했지만 멀티 스레딩과 해당 구현에 문제가 있을지 걱정됩니다.
캐슬 윈저 (Castle Windsor) 나 닌젝트 (Ninject)를 사용하여 많은 사람들이이 문제를 해결해 왔지만 내 수준의 전문 지식을 벗어났습니다. 심지어 윈저 튜토리얼 (https://github.com/castleproject/Windsor/blob/master/docs/mvc-tutorial-intro.md)을 통과 한 후에도 정확히 무엇을해야하는지 이해할 수 없습니다.
Castle Windsor 또는 Ninject를 사용하는 경우 Thor의 망치로 핀을 치려고하는 것과 같습니다. –