当我将对象缓存到HttpContext Cache
时,我的对象在下一次读取时消失,我必须再次重新插入对象(并非总是只有90%的时间)。在那之后,对象保持在那里没有任何问题。
发生了什么:
CacheItemRemovedCallback
立即执行。 CacheItemRemovedReason
值为Removed
那么为什么Cache
有问题要将对象保留在第一次插入的缓存中?
此行为存在于.Net framework 3.5, 4.0, 4.5, 4.5.2
。
以下是代码:
public class HomeController : Controller
{
public ActionResult Index()
{
int? age = this.HttpContext.Cache.Get("age") as int?;
if (age == null)
{
age = 50;
this.HttpContext.Cache.Add("age", age, null, DateTime.Now.AddHours(5), TimeSpan.Zero, CacheItemPriority.Default, new CacheItemRemovedCallback(this.CacheItemRemovedCallback));
}
return View();
}
public void CacheItemRemovedCallback(String key, Object value, CacheItemRemovedReason reason)
{
}
}
答案 0 :(得分:2)
我的缓存项目在插入后立即删除的原因是因为第一次调用网站后 AppDomain被卸载。通过捕获AppDomain
的卸载事件,我已经能够知道关闭原因。 防病毒正在扫描触发FileChangesMonitor
AppDomain
事件的网站文件,然后触发卸载AppDomain 。
以下是如何检测AppDomain卸载的原因:
<强> Global.asax中强>
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.DomainUnload += DomainUnloadEventHandler;
}
static void DomainUnloadEventHandler(object sender, EventArgs e)
{
var httpRuntimeType = typeof(HttpRuntime);
var httpRuntime = httpRuntimeType.InvokeMember(
"_theRuntime",
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField,
null, null, null) as HttpRuntime;
var shutDownMessage = httpRuntimeType.InvokeMember(
"_shutDownMessage",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
null, httpRuntime, null) as string;
string shutDownStack = httpRuntime.GetType().InvokeMember(
"_shutDownStack",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
null, httpRuntime, null) as string;
}
}
这里是shutDownMessage
变量包含的内容:
_shutDownMessage: Change Notification for critical directories.
bin dir change or directory rename
HostingEnvironment initiated shutdown
HostingEnvironment caused shutdown
Change in C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\48a6542f\e317ebf6\hash\hash.web
您是否可以看到, hash.web 文件是AppDomain卸载的原因。现在,谁在改变这个文件?原来是防病毒软件。通过停用McAfee的按访问扫描程序,hash.web文件不再被更改,因此没有AppDomain卸载。问题解决了!
有关详细信息,请参阅此blog post。