Asp.net mvc 4 在异步任务中无法保存到HttpRuntime.Cache

Asp.net mvc 4 在异步任务中无法保存到HttpRuntime.Cache,asp.net-mvc-4,caching,asp.net-web-api,async-await,Asp.net Mvc 4,Caching,Asp.net Web Api,Async Await,我正在修改一些代码来执行XYZ之类的操作,并且遇到了一个问题 WebAPI方法 public async Task<FileUploadResult> PostFile([FromUri]int width) { // Right here the HTTPContext.Current == null; ... Some code here await Request.Content.ReadAsMultipartAsync(streamProvider);

我正在修改一些代码来执行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。 据我所知,我可以从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));
在此问题上的任何帮助都将不胜感激


提前谢谢。

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

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