私は現在、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では、 フィルタがより積極的にキャッシュされます。したがって、不適切なインスタンス状態を格納する任意のカスタムアクション フィルタが壊れている可能性があります。
私はこの問題を解決する最善の方法がわかりませんよ。私は2つのプライベートな読み取り専用フィールドをOnActionExecutingピースに移動して問題を解決すると考えましたが、マルチスレッドとその実装に問題があるかどうか心配です。
Castle WindsorまたはNinjectを使用してこの問題を回避している人は多いようですが、それは私の専門知識の範囲外で、Windsorチュートリアル(https://github.com/castleproject/Windsor/blob/master/docs/mvc-tutorial-intro.md)を経ても正確に何をする必要があるのか理解できません。
Castle Windsorを使用している場合、またはNinjectはThorのハンマーでピンを叩くようなものです。 –