【问题标题】:Unable to save to HttpRuntime.Cache while in an async Task在异步任务中无法保存到 HttpRuntime.Cache
【发布时间】:2013-10-01 21:46:53
【问题描述】:

我正在修改一些代码来执行 XYZ 等操作,但遇到了问题。

WebAPI 方法

public async Task<FileUploadResult> PostFile([FromUri]int width)
{
    // Right here the HTTPContext.Current == null;
    ... Some code here
    await Request.Content.ReadAsMultipartAsync(streamProvider);
}

我已经查看并看到此行将恢复您的 HttpContext.Current

add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"

所以我添加了上述设置,它返回 HttpContext.Current。 据我所知,我可以从 HttpContext.Current.Cache 和 HttpRuntime.Cache 访问(读取).Cache 对象。

但是,由于某种原因,我无法成功写入缓存。

我的代码没有抛出异常,但是当我尝试读取缓存时它根本不存在。

我的代码在其他任何地方都运行良好,只是不在异步 Web api 调用中。

缓存代码

private Cache sysCache = HttpContext.Current.Cache;
// also treid  private Cache sysCache = HttpRuntime.Cache
sysCache.Insert(fileToCache.ToMD5HashString(), 
                        fileToCache,
                        null,
                        Cache.NoAbsoluteExpiration,
                        new TimeSpan(0, 0, 5, 0));

对于这个问题的任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 一旦你进入 async 你就会失去当前的上下文(包括 HttpContext.Current)。尝试将当前的 HttpContext 作为参数传递。
  • 我尝试了您的建议,但不幸的是它没有奏效。这里还有其他东西在起作用,不会让我存储到缓存中。即使我能够使用您的建议或 key="aspnet:UseTaskFriendlySynchronizationContext" value="true" 访问缓存(读取),存储到缓存的项目也不会保存。
  • 这很奇怪,因为文档指出“每个应用程序域都有一个 Cache 类的实例。因此,Cache 属性返回的 Cache 对象是所有请求的 Cache 对象应用程序域。”
  • 插入后是否检查过该项目是否存在?你试过HttpRuntime.Cache吗?
  • 是的,我尝试过 HttpRuntime,结果似乎是一样的。需要注意的一点 - 当从辅助线程调用缓存时,缓存是空的(存储了 0 个项目),当从主线程调用时,缓存存储了大约 50 个项目。因此,当我将项目插入缓存(辅助线程)时,是的,结果确实显示了我刚刚插入的项目,它们是当时缓存中唯一的项目。但是当我检查主线程上的缓存时,它们不存在。

标签: asp.net-mvc-4 caching asp.net-web-api async-await


【解决方案1】:

非常感谢您的帮助。事实证明,它根本与异步运行时无关。事实证明,我将项目存储到缓存中的类,以及尝试调用这些项目的 Web api 位于同一站点下的两个不同应用程序中,因此它们有两个不同的缓存存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多