为什么我必须将我的对象放入 HttpContext 缓存中两次才能永久保留它?

2024-01-01

当我将一个对象缓存到HttpContext Cache,我的对象在下次读取时消失,我必须再次重新插入该对象(并非总是如此,但 90% 的时间)。之后,该物体就毫无问题地停留在那里。

发生的情况如下:

  1. 开始调试mvc项目
  2. 从缓存中读取年龄
  3. The 年龄为空所以我把 50 放入变量中,然后将其插入缓存中
  4. The CacheItemRemovedCallback当对客户端的响应完成后立即执行。这CacheItemRemovedReason值为Removed
  5. 用户点击立即刷新
  6. 从缓存中读取年龄
  7. The 年龄仍然为空所以我把 50 放入变量中,然后将其插入缓存中
  8. 用户点击立即刷新
  9. 从缓存中读取年龄
  10. The 年龄终于来了!

那么为什么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)
    {
    }
}

我的缓存项在插入后立即被删除的原因是AppDomain 被卸载第一次调用该网站后。通过捕获卸载事件AppDomain,我已经能够知道关闭原因了。这防病毒软件正在扫描触发该网站的文件FileChangesMonitor事件的AppDomain然后触发了卸载AppDomain.

以下是如何检测 AppDomain 被卸载的原因:

全局.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 卸载。问题解决了!

欲了解更多信息,您可以阅读此内容博客文章 http://blogs.msdn.com/b/tess/archive/2008/05/14/asp-net-performance-issue-large-number-of-application-restarts-due-to-virus-scanning.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我必须将我的对象放入 HttpContext 缓存中两次才能永久保留它? 的相关文章

  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • __doPostBack 重新加载整个页面而不仅仅是 UpdatePanel

    在我的 javascript 中 我有以下行 doPostBack MyPanel MyParam 在后面的代码中 我使用 MyParam 查询数据库并将结果绑定到 MyPanel updatepanel 内的 gridview updat
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助

随机推荐

  • 用 Javascript 求最大质因数

    谢谢阅读 总的来说 对于 Javascript 和编程来说还是很陌生的 我正在寻找一种方法来返回给定数字的最大素因数 我的第一直觉是使用一个 while 循环来计数并找到该数字的质因数 将这些因数存储在数组中并在每次找到一个时重置 这样数组
  • curl: (3) URL 位置 1 中不匹配的大括号:

    我正在从这里运行 Apache Solr 教程 http lucene apache org solr guide 7 6 solr tutorial html http lucene apache org solr guide 7 6 s
  • 如何枚举 Excel 中的重复行?

    我的数据看起来像这样 Monkey Donkey Elephant Panda Donkey Donkey Monkey 我想用数字来区分行 对每个重复项进行计数 Monkey 1 Donkey 1 Elephant 1 Panda 1 D
  • 无法使用数据表和免费编辑器编辑/创建/删除表中的元素

    我正在尝试使用来自 AJAX 调用的 JSON 格式的数据构建一个可编辑表 为此 我将数据表插件与免费数据表编辑器 kingkode com free datatables editor alternative 一起使用 我无法使用数据表编
  • 按下按钮时关闭虚拟键盘

    我有一个Activity与EditText 一个按钮和一个ListView 目的是在搜索屏幕中键入EditText 按下按钮 搜索结果就会填充到此列表中 这一切都工作正常 但虚拟键盘的行为很奇怪 如果我点击EditText 我得到了虚拟键盘
  • 如何读取 WebGL 中的深度缓冲区?

    使用 WebGL API 除了执行我自己的光线投射之外 如何从深度缓冲区获取值 或以任何其他方式从屏幕坐标确定 3D 坐标 即找到单击的位置 几年过去了 这些天WEBGL depth texture扩展广泛可用 除非您需要支持 IE 一般用
  • myspace和linkedin在iphone中的实现

    我想在 iPhone 应用程序中实现 LinkedIn 和 Myspace 我的意思是我想使用我的应用程序更改两者的状态 是否有任何 API 可以同时访问这两者 我尝试了 OAuth API 但它仅适用于 Twitter 谢谢 提前 Lin
  • 了解 TodoMVC 示例

    开始学习node js 和backbone js 并使用TodoMVC 示例作为我的指南 有几个部分我很难理解 见下文 这是app js var express require express http require http mongo
  • 如何使用 python 加载 *.hdr 文件

    我想阅读 hdr 文件格式的环境地图 似乎非常流行的库不支持 hdr 文件读取 例如 OpenCV PIL 等 那么如何将 hdr 文件读取到 numpy 数组中呢 I found ImageIO http imageio github i
  • 是否有相当于“ListView.addHeaderView”的 XML 标记?

    是否有一个 XML 标签可以在布局文件中使用 它相当于ListView addHeaderView http developer android com reference android widget ListView html addH
  • 如何在 ZF2 / ZF3 url 视图助手中添加查询参数

    我正在尝试使用路由创建带有查询字符串的 url 如下所示 this gt url users gt users this gt url users sort gt desc gt users sort desc 然而这似乎不起作用 第二个助
  • Ruby + Windows + 超时 + 串行端口不起作用

    我正在开发一个多平台 Ruby 程序 该程序应该通过 USB 连接到串行设备 首先我使用了serialport gem 1 0 4 但后来我遇到了一些奇怪的问题 不得不放弃它 然后我继续通过Ruby的IO类进行通信 如下所示 port IO
  • 错误:index.js:找不到模块“babel-plugin-r”React Native

    我做了什么导致了错误 我有一个新安装的 Bare React Native Project 我想使用抽屉导航并且必须安装 React Native Reanimated 2 3 0 alpha 2 我已经尝试解决该错误 我已经安装了新的裸反
  • 回归对输入变量之一给出错误“对比只能应用于具有 2 个或更多级别的因素”[重复]

    这个问题在这里已经有答案了 我正在 R 中使用大量输入变量运行 logit 回归 newlogit lt glm install SIZES GROSSCONSUMPTION NETTCONSUMPTION NETTGENERATION G
  • Node.js - 资源解释为脚本,但使用 MIME 类型 text/plain 进行传输

    首先 我没有使用 Express 有了这个 当我加载我的index html递归归档readFile每个附加文件 例如我的 CSS 和 JS 页面 但它总是在我的检查器 Chrome 中返回此错误 资源解释为脚本 但以 MIME 类型 te
  • 将 css-loader 与 Webpack + React 一起使用

    我正在使用 Webpack 和 css loader w modules 构建我的 React 应用程序 我喜欢它 不过 我的大多数样式表都非常小 我想将它们内联到与我的标记和 JavaScript 相同的 JSX 文件中 我现在使用的 C
  • bootstrap.css 和 bootstrap-combined.min.css 有什么区别?

    我正在使用 bootstrap css 我发现还有另一个名为的 css 文件bootstrap combined min css 风格上有什么区别吗 是否需要包含这两个 css 文件 哪一个更可取 文件bootstrap combined
  • Python 中的矩阵求幂

    我正在尝试用 Python 对复杂矩阵求幂 但遇到了一些麻烦 我正在使用scipy linalg expm函数 并且当我尝试以下代码时出现相当奇怪的错误消息 import numpy as np from scipy import lina
  • 如何向另一个节点发送消息?

    我想实现一个简单的聊天室 其中两个节点可以同步向对方发送消息 没有一个节点充当服务器的角色 我可以用吗 向另一个节点发送消息 如果我通过以下函数获得该节点上进程的 pidspawn Node Module Fun Args 您可以发送到另一
  • 为什么我必须将我的对象放入 HttpContext 缓存中两次才能永久保留它?

    当我将一个对象缓存到HttpContext Cache 我的对象在下次读取时消失 我必须再次重新插入该对象 并非总是如此 但 90 的时间 之后 该物体就毫无问题地停留在那里 发生的情况如下 开始调试mvc项目 从缓存中读取年龄 The 年