asp.net – 缓存在它应该到期之前到期
有人可以帮我吗?我有以下代码来存储和修复catch,但是,它不起作用.即使我在slidingExpiration中将其设置为14天,缓存也会在几分钟内到期.提前致谢!
public static List<ReplyDTO> VideoCommentList() { List<ReplyDTO> replyList = new List<ReplyDTO>(); if (HttpRuntime.Cache["videoComment"] == null) { HttpRuntime.Cache.Remove("videoComment"); HttpRuntime.Cache.Insert("videoComment",replyList,null,Cache.NoAbsoluteExpiration,TimeSpan.FromDays(14)); } else { replyList = (List<ReplyDTO>)HttpRuntime.Cache["videoComment"]; } if (replyList.Count > 8) { replyList = replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList(); } else { replyList = replyList.OrderByDescending(x => x.DateCreated).ToList(); } return replyList; } public static List<ReplyDTO> AddVideoComment(ReplyDTO replyDTO) { List<ReplyDTO> replyList = new List<ReplyDTO>(); replyList = VideoCommentList(); replyList.Add(replyDTO); HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14)); if (replyList.Count > 8) { replyList = replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList(); } else { replyList = replyList.OrderByDescending(x => x.DateCreated).ToList(); } return replyList; } 解决方法
ASP.net缓存是内存中的,因此如果您的IIS进程或应用程序池回收,它将变得清晰.您可以检查以下可能导致流程再循环的事项
>如果修改web.config,IIS将关闭旧实例并慢慢将流量传输到新实例,在此过程中将回收内存中的内容.如何检查:您可以通过检查AppDomain.IsFinalizingForUnload并在回调期间记录该情况来检测这种情况. 编辑 在程序中,您将replyList项添加到缓存,然后执行.Take()操作.由于replyList是引用对象,如果你修改它,它也会在缓存中得到更新.因此,如果在您的程序中,如果您执行replyList == null,它将更新缓存中的项目. 所以修改你的代码并尝试 public static List<ReplyDTO> VideoCommentList() { List<ReplyDTO> replyList = new List<ReplyDTO>(); if (HttpRuntime.Cache["videoComment"] == null) { //Call to .Remove is not required //HttpRuntime.Cache.Remove("videoComment"); HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14)); } else { //No need to check count > 8,Take will handle it for you replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"]) .OrderByDescending(x => x.DateCreated) .Take(8).ToList(); } return replyList; } public static List<ReplyDTO> AddVideoComment(ReplyDTO replyDTO) { //Read from cache List<ReplyDTO> replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"]); if(replyList == null) replyList = VideoCommentList(); replyList.Add(replyDTO); HttpRuntime.Cache.Insert("videoComment",TimeSpan.FromDays(14)); //Here you are creating a new list,and not referencing the one in the cache return replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList(); } 重要建议 如果要检查从缓存中删除对象的时间和原因,可以在插入时获取CacheItemRemovedCallback选项的帮助.使用此参数和CacheItemRemovedReason参数,可以记录从缓存中删除对象的原因.原因 >已删除 – 您的代码已通过调用“插入”或“删除”方法从缓存中删除了该项. 希望这些信息可以帮助您. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – asp .net mvc授权
- ASP.NET推送重定向会话超时
- 将azure AD身份验证与asp.net核心身份个人帐户集成
- 奇怪的#_ = _出现在response.redirect ASP.NET之后的url末尾
- 在ASP.NET MVC Core项目中使用View内部的C#7功能
- asp.net – 当请求具有查询字符串时,Web服务的缓存不起作用
- asp.net-mvc-3 – .NET MVC 3以编程方式设置布局
- entity-framework – 数据读取器与指定的模型不兼容
- asp.net – 无法从’System.Data.Linq.Binary’转换为’Sys
- asp.net-mvc – 每个请求DbContext发生随机错误