【发布时间】: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