Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中缓存以提高性能[ASP.Net MVC]_C#_Asp.net Mvc_Caching - Fatal编程技术网

C# 在C中缓存以提高性能[ASP.Net MVC]

C# 在C中缓存以提高性能[ASP.Net MVC],c#,asp.net-mvc,caching,C#,Asp.net Mvc,Caching,我在controller中有一个函数,它返回一个国家列表。我正在尝试在其中实现缓存。因此,只有在服务器端为空时才能获取该列表。我找到了两种方法: 使用OutputCache 但我无法测试它,可能是因为客户端和服务器都是我自己 使用MemoryCache 我无法正确执行第二个 有什么建议吗 更新1: 我无法使用cacheObject或访问现在为对象类型的列表 我尝试了以下解决方案: 1. var mylist = (from p in cacheObject.Cast<string>(

我在controller中有一个函数,它返回一个国家列表。我正在尝试在其中实现缓存。因此,只有在服务器端为空时才能获取该列表。我找到了两种方法:

使用OutputCache

但我无法测试它,可能是因为客户端和服务器都是我自己

使用MemoryCache

我无法正确执行第二个

有什么建议吗

更新1:

我无法使用cacheObject或访问现在为对象类型的列表

我尝试了以下解决方案:

1. var mylist = (from p in cacheObject.Cast<string>(IQueryable) select p).ToList();


2. List<string> mylist = cacheObject.AsQueryable().Cast<string>().Select(values).ToList();
 values.AddRange(mylist);
但是我无法创建字符串类型的列表:

MemoryCache.Default已经是静态的,不需要再次存储它

您可以实现与此类似的功能:

ObjectCache cache = MemoryCache.Default;
var cacheObject = cache.Get(cacheKey);

if (cacheObject == null)
{
    cacheObject = //do something to get it
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2);
    cache.Add(cacheKey, cacheObject, policy);
}
return cacheObject;
更新


就@mjwills而言,如果您有一个web场/负载平衡站点,那么每个服务器都将拥有自己的缓存,并且它们可能至少在服务器之间的过期期间不同步。你可能同意,也可能不同意。如果不考虑NCache、ReDIS或类似的产品,

您想在哪个级别添加一些缓存层?在控制器上?是的。在控制器上OutputCache的优点是能够进行客户端缓存,即浏览器缓存,这意味着浏览器不需要从服务器请求资源。这对你有用吗?我想没有。因为我试图减少首次页面加载时间。这不会有任何区别。最好将列表保存在服务器的缓存中。最好将列表保存在服务器的缓存中。OutputCache可以同时进行客户端和服务器缓存。此外,它还可以缓存在任何下游服务器上,例如代理服务器-。另外,如果您以后添加CDN,您将再次获得改进的加载时间。老实说,如果你想缓存整个HTTP请求,你应该强烈地考虑OutPache。这就是它的用途。我有一个国家列表。如何设置cacheobject或cachekey?cacheobject=。如果不想强制转换调用方,也可以将其设为泛型方法并返回TcacheObject。和cachekey?它是一种字符串。是的,cachekey是指在缓存中引用对象的方式。请确保使用逻辑且唯一的值,因为如果对不同的缓存对象重复使用键,可能会发生细微的错误。
   ObjectCache cache = MemoryCache.Default;
            string cacheKey = "countrylist";
            var cacheObject = cache.Get(cacheKey);

            if (cacheObject == null)
            {
                cacheObject = getelement();//returns a list of string type
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60);
                cache.Add(cacheKey, cacheObject, policy);

            }    
1. var mylist = (from p in cacheObject.Cast<string>(IQueryable) select p).ToList();


2. List<string> mylist = cacheObject.AsQueryable().Cast<string>().Select(values).ToList();
 values.AddRange(mylist);
ObjectCache cache = MemoryCache.Default;
var cacheObject = cache.Get(cacheKey);

if (cacheObject == null)
{
    cacheObject = //do something to get it
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2);
    cache.Add(cacheKey, cacheObject, policy);
}
return cacheObject;