C# MVC应用程序的输出缓存或httpcontext.current.cache
我们正在构建一个MVC应用程序,当用户第一次登录时,将加载大量静态数据 幸运的是,在登录期间必须加载的大多数数据都是主数据,对于任何用户都不会更改 但由于主数据的大小非常大,我们认为最好在服务器端实现缓存,因为浏览器可能无法保存数据 我读过一位微软MVP在C# MVC应用程序的输出缓存或httpcontext.current.cache,c#,asp.net-mvc,asp.net-mvc-4,caching,C#,Asp.net Mvc,Asp.net Mvc 4,Caching,我们正在构建一个MVC应用程序,当用户第一次登录时,将加载大量静态数据 幸运的是,在登录期间必须加载的大多数数据都是主数据,对于任何用户都不会更改 但由于主数据的大小非常大,我们认为最好在服务器端实现缓存,因为浏览器可能无法保存数据 我读过一位微软MVP在OutputCache上发表的codeproject文章,他清楚地解释了缓存的作用以及使用缓存时需要记住的事项。 所以我实现了他在我的控制器中提出的所有建议,只需添加行 [OutputCache(Duration = 10, VaryByPar
OutputCache
上发表的codeproject
文章,他清楚地解释了缓存的作用以及使用缓存时需要记住的事项。
所以我实现了他在我的控制器中提出的所有建议,只需添加行
[OutputCache(Duration = 10, VaryByParam = "none",
Location=OutputCacheLocation, NoStore=true)]
在我的行动方法之上
但我无法调试数据是从缓存加载还是发生了另一次服务器命中。
所以我的第一个问题是如何调试输出缓存是否工作
然后,在我们以前的MVC应用程序中,我们使用了httpcontext.current.cache
,它工作得非常好。
所以,这里是我的第二个问题,这就是为什么我更喜欢OuputCache
而不是httpcontext.current.cache
,反之亦然
它们在缓存应用程序方面有什么区别
编辑:1
这是我的登录视图控制器中的方法
public ActionResult GetRegions(string Ids)
{
objRegionsResult = GetRegionsList();
if (!string.IsNullOrEmpty(Ids))
objRegionsResult = objRegionsResult.Where(x => Ids.Split(',').Contains(x.Type.ToString())).ToList();
return Json(objRegionsResult, JsonRequestBehavior.AllowGet);
}
private List<MORegionMaster> GetRegionsList()
{
RequestUri = "Home/GetRegions";
HttpResponseMessage response = ConnectAPI(RequestUri);
if (response.IsSuccessStatusCode)
{
objRegionsResult = response.Content.ReadAsAsync<List<MORegionMaster>>().Result;
}
}
return objRegionsResult;
}
public ActionResult GetRegions(字符串ID)
{
objRegionResult=getRegionList();
如果(!string.IsNullOrEmpty(Ids))
objRegionsResult=objRegionsResult.Where(x=>Ids.Split(',')。包含(x.Type.ToString()).ToList();
返回Json(objRegionResult,JsonRequestBehavior.AllowGet);
}
私有列表getRegionList()
{
RequestUri=“Home/GetRegions”;
httpresponsemessageresponse=ConnectAPI(RequestUri);
if(响应。IsSuccessStatusCode)
{
objRegionsResult=response.Content.ReadAsAsync().Result;
}
}
返回objRegionsResult;
}
因此,上面的方法就是我点击api控制器的地方,它会点击businesslogic类,然后点击数据库并返回datatable。当我们想要缓存操作的结果(不是静态文件,而是缓存业务逻辑结果)时,我们使用OutputCache。当我们希望在特定的时间段内为所有用户提供数据时,我们就使用它 当我们想要缓存一些可以在同一请求中多次使用的数据时,我们使用httpcontext.current.cache,比如缓存“当前登录的用户对象”,以避免多个db命中
此外,输出缓存的生存期不仅限于当前http请求,而且httpcontext.current.Cache的生存期仅限于当前http请求。否,可能您误解了我的要求。我的要求不是缓存js、css文件,我需要缓存每次用户登录时通过API调用获取的主数据。但是,对于所有不同的用户,主数据保持不变,因此我需要在服务器中缓存数据。是否只缓存业务逻辑?您是从api调用获取主数据,还是在请求中的某个位置使用主数据?为了更清楚,我在问题中添加了代码,请浏览编辑:1部分,您可以使用OutputCache和VaryByParam true来执行GetRegions操作,并使用System.Runtime.Caching.MemoryCache缓存GetRegionList()结果。我指的是MemoryCache,因为它的生存期不限于当前http请求,而httpcontext.current.cache的生存期仅限于当前请求。