问题描述
|
因此,当我尝试通过
OnActionExecuting
ActionFilterattribute
中的存储库访问ObjectContext
时,出现了The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
错误。
我的“ 3”检查HTTP cookie的存在。如果存在,它将与数据库一起验证,刷新其到期时间,然后将其添加到Controller
ViewData
集合中,以便ActionResult
可以访问它。如果不存在,则会将用户重定向到登录页面。
过滤器一半有效,因为当HTTP cookie确实存在并且尝试从数据库中获取具体对象时,它会崩溃并显示上述错误消息。
由于到位的层数很多,我将继续将代码发布到VerifyCookieAttribute.cs
,CookieRepository.cs
和Repository_1.cs
上。最后,尽管可能没有什么区别,但在Repository_1.cs
的SelectSingle
方法中会发生错误。
依赖注入由Ninject 2.2.1.0提供。当前启用了延迟加载,但是任一设置都会产生相同的错误。
无论如何,对于所有这些方面我都会出错的地方,我将不胜感激。在此先感谢您的帮助!
// VerifyCookieAttribute.cs
[AttributeUsage(AttributeTargets.Class,AllowMultiple = false,Inherited = true)]
internal class VerifyCookieAttribute : ActionFilterattribute {
[Inject]
public CookieRepository Repository { private get; set; }
private HttpRequestBase Request = null;
private HttpResponseBase Response = null;
private readonly bool Administration = false;
private readonly bool Customers = false;
private readonly string[] Excludedpaths = new string[2] {
\"/Administration\",\"/Customers\"
};
public VerifyCookieAttribute(
bool Administration,bool Customers) {
this.Administration = Administration;
this.Customers = Customers;
}
public override void OnActionExecuting(
ActionExecutingContext ActionExecutingContext) {
this.Request = ActionExecutingContext.HttpContext.Request;
if (!this.Excludedpaths.Contains(this.Request.Url.AbsolutePath)) {
this.Response = ActionExecutingContext.HttpContext.Response;
if (this.Exists()) {
Cookie Cookie = this.Get();
this.Refresh(Cookie);
ActionExecutingContext.Controller.ViewData.Add(\"Cookie\",Cookie);
if (this.Administration) {
ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
area = \"Administration\",controller = \"Administration\",action = \"Dashboard\"
}));
} else if (this.Customers) {
// Do nothing
};
} else if (!this.Exists() && !this.Response.IsRequestBeingRedirected) {
if (this.Administration) {
ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
area = \"Administration\",action = \"Default\"
}));
} else if (this.Customers) {
ActionExecutingContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {
area = \"Customers\",controller = \"Customers\",action = \"Default\"
}));
};
};
};
}
private bool Exists() {
string Token = this.GetHttpCookietoken();
return (!String.IsNullOrEmpty(Token) && (Token.Length == 256));
}
private Cookie Get() {
string Token = this.GetHttpCookietoken();
Cookie Cookie = this.Repository.SelectSingle(
c =>
(c.Token == Token));
return (Cookie);
}
private string GetHttpCookietoken() {
if (this.Request.Cookies[\"NWP\"] != null) {
return this.Request.Cookies[\"NWP\"][\"Token\"];
};
return (string.Empty);
}
private void Refresh(
Cookie Cookie) {
if (Cookie.RefreshStamp <= DateTime.Now.AddHours(1)) {
this.Repository.RefreshCookie(Cookie.CookieId);
this.SetHttpCookie(Cookie);
};
}
private void SetHttpCookie(
Cookie Cookie) {
this.Response.Cookies[\"NWP\"][\"Token\"] = Cookie.Token;
this.Response.Cookies[\"NWP\"].Expires = Cookie.RefreshStamp.AddHours(1);
}
}
// CookieRepository.cs
public sealed class CookieRepository : Repository<Cookie> {
[Inject]
public CookieRepository(
Entities Entities)
: base(Entities,true) {
}
public void RefreshCookie(
int CookieId) {
this.Entities.ExecuteFunction(\"RefreshCookie\",new ObjectParameter(\"CookieId\",CookieId));
}
}
// Repository`1.cs
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {
protected readonly Entities Entities = null;
private readonly IObjectSet<TEntity> EntitySet = null;
[Inject]
public Repository(
Entities Entities)
: this(Entities,true) {
}
[Inject]
public Repository(
Entities Entities,bool CreateEntitySet) {
this.Entities = Entities;
if (CreateEntitySet) {
this.EntitySet = this.Entities.CreateObjectSet<TEntity>();
};
}
public virtual void Delete(
TEntity TEntity) {
this.EntitySet.DeleteObject(TEntity);
}
public virtual void Insert(
TEntity TEntity) {
this.EntitySet.Addobject(TEntity);
}
public virtual IQueryable<TEntity> Select() {
return this.EntitySet;
}
public virtual IQueryable<TEntity> Select(
Expression<Func<TEntity,bool>> Selector) {
return this.EntitySet.Where(Selector);
}
public virtual bool SelectAny(
Expression<Func<TEntity,bool>> Selector) {
return this.EntitySet.Any(Selector);
}
public virtual IList<TEntity> SelectList() {
return this.EntitySet.ToList();
}
public virtual IList<TEntity> SelectList(
Expression<Func<TEntity,bool>> Selector) {
return this.EntitySet.Where(Selector).ToList();
}
private IList<TEntity> SelectOrderedList(
bool Ascending,params Expression<Func<TEntity,IComparable>>[] Orderers) {
IOrderedQueryable<TEntity> Queryable = null;
foreach (Expression<Func<TEntity,IComparable>> Orderer in Orderers) {
if (Queryable == null) {
Queryable = (Ascending ? this.EntitySet.OrderBy(Orderer) : this.EntitySet.OrderByDescending(Orderer));
} else {
Queryable = (Ascending ? Queryable.ThenBy(Orderer) : Queryable.ThenByDescending(Orderer));
};
};
return (Queryable.ToList());
}
public virtual IList<TEntity> SelectOrderedList(
params Expression<Func<TEntity,IComparable>>[] Orderers) {
return this.SelectOrderedList(true,Orderers);
}
public virtual IList<TEntity> SelectOrderedDescendingList(
params Expression<Func<TEntity,IComparable>>[] Orderers) {
return this.SelectOrderedList(false,Orderers);
}
public virtual TEntity SelectSingle(
Expression<Func<TEntity,bool>> Selector) {
return this.EntitySet.Single(Selector);
}
public virtual void Update() {
this.Entities.SaveChanges();
}
public virtual IEnumerable<TEntity> Where(
Expression<Func<TEntity,bool>> Selector) {
return this.EntitySet.Where(Selector);
}
}
更新
这是每个@jfar请求的堆栈跟踪:
M14ѭ1forMergeOption)+46
System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +44
System.Linq.Enumerable.Single(IEnumerable
1源)+184
System.Data.Objects.ELinq.ObjectQueryProvider.b_3(IEnumerable1 sequence) +41
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable
1查询,表达式queryRoot)+59
System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(表达式)+150
System.Linq.Queryable.Single(IQueryable1 source,Expression
1谓词)+300
C:\\ Projects中的{WITHHELD}.Repositories.Repository1.SelectSingle(Expression
1选择器){WITHHELD} {WITHHELD} \\ Repositories \\Repository1.cs:98
VerifyCookieAttribute.Get() in C:\\Projects\\{WITHHELD}\\{WITHHELD}\\Attributes\\VerifyCookieAttribute.cs:100
VerifyCookieAttribute.OnActionExecuting(ActionExecutingContext ActionExecutingContext) in C:\\Projects\\{WITHHELD}\\{WITHHELD}\\Attributes\\VerifyCookieAttribute.cs:55
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,ActionExecutingContext preContext,Func
1续)+47
System.Web.Mvc。<> c_displayClass17.b_14()+19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func1 continuation) +263
System.Web.Mvc.<>c__displayClass17.<InvokeActionMethodWithFilters>b__14() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,Func
1延续)+263
System.Web.Mvc。<> c_displayClass17.b_14()+19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func1 continuation) +263
System.Web.Mvc.<>c__displayClass17.<InvokeActionMethodWithFilters>b__14() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList
1过滤器,ActionDescriptor actionDescriptor,IDictionary2 parameters) +191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__displayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__displayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__displayClass8
1.b_7(IAsyncResult)+12
System.Web.Mvc.Async.WrappedAsyncResult`1.End()+62
System.Web.Mvc。<> c_displayClasse.b_d()+50
System.Web.Mvc.SecurityUtil.b_0(动作f)+7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(动作)+22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8862381
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值并已完成同步)+184
解决方法
我假设您正在使用mvc 3。
在早期版本的ASP.NET MVC中,
根据请求创建操作过滤器
除了少数情况。这种行为
从来都不是保证的行为,但是
只是实现细节,
过滤器的合同是
认为他们是无国籍的。在ASP.NET中
MVC 3,过滤器被更多地缓存
积极地。因此,任何习惯
动作过滤器存储不当
实例状态可能已损坏。
这意味着不会为每个请求都创建属性,因此任何“ 23”注入都将无效。您将需要注入
IServiceProvider
并在每次请求时获取包含该信息的存储库,或者手动创建新的上下文。