Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 不同ASP.NET缓存选项的优缺点_C#_Asp.net_Asp.net Mvc_Caching_Asp.net Web Api - Fatal编程技术网

C# 不同ASP.NET缓存选项的优缺点

C# 不同ASP.NET缓存选项的优缺点,c#,asp.net,asp.net-mvc,caching,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Caching,Asp.net Web Api,我最近问了一个关于在ASP.NET MVC WebAPI应用程序中缓存应用程序数据的问题,这让我想到了一个新问题。ASP.NET中可用的不同缓存方法的优缺点是什么 我遇到了: 内存缓存 使用静态成员变量: private static Northwind.SuppliersDataTable suppliers = null; 应用程序状态: HttpContext.Current.Application["key"] ="Value" 数据缓存: HttpRuntime.Cach

我最近问了一个关于在ASP.NET MVC WebAPI应用程序中缓存应用程序数据的问题,这让我想到了一个新问题。ASP.NET中可用的不同缓存方法的优缺点是什么

我遇到了:

  • 内存缓存

  • 使用静态成员变量:

    private static Northwind.SuppliersDataTable suppliers = null;
    
  • 应用程序状态:

     HttpContext.Current.Application["key"] ="Value"
    
  • 数据缓存:

    HttpRuntime.Cache.Insert(
      /* key */                "key", 
      /* value */              "value", 
      /* dependencies */       null, 
      /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
      /* slidingExpiration */  Cache.NoSlidingExpiration, 
      /* priority */           CacheItemPriority.NotRemovable, 
      /* onRemoveCallback */   null);
    
我肯定还有其他的,而且我知道它们在技术上都是将数据存储在内存中的……那么我应该使用什么作为ASP.NET MVC webapi呢

我的上一个问题:

每种缓存技术/方法都有自己的一套功能。这些特性在一个应用程序需求中似乎是不利的,但在其他应用程序需求中可能是有利的

因此,简而言之,根据您的需求决定哪种缓存技术和哪种功能最适合您

例如,让我们讨论一些客户端缓存技术

MSDN表示,我们还可以使用
HiddenField
在隐藏字段中仅存储少量频繁更改的数据,因为这些数据包含在每次回发时到服务器的往返过程中

此功能的优点:通过使用客户端选项存储页面信息,减少服务器上的工作负载

然而,MSDN明确表示:这种方法的安全性支持最低

因此,人们可能会也可能不会始终使用此功能,因为安全考虑也存在

再考虑一个示例
页面输出缓存
:它有两种类型,页面输出缓存和页面片段缓存

页面输出缓存缓存整个网页,仅当该网页的内容相当静态时才适用。如果页面的某些部分正在更改,则可以将静态部分包装为用户控件,并使用页面片段缓存来缓存用户控件

和对
应用程序的最后一条评论
vs
HttpRuntime.cache

应用程序
不是缓存,而是全局命名值集合。如果将对象添加到
应用程序
,它将一直保留到appdomain回收

  • 应用程序变量是web应用程序的所有用户之间共享的变量
  • 应用程序变量的行为类似于静态变量,它们可以替代静态变量,因为静态变量在web应用程序中是无状态的
  • 应用程序变量中应该只保留共享值,一旦不使用它们,就应该显式删除它们
缓存
:通过在
应用程序
缓存
类中缓存频繁请求的对象和数据,可以显著提高ASP.NET应用程序的性能。虽然
缓存
类无疑提供了更大的灵活性和控制,但它似乎只提供了一个边际优势,即与
应用程序
类相比,它增加了缓存的吞吐量。与应用程序不提供此功能的事实相反,开发一个测试方案来准确测量
缓存
类通过清除过程对较少使用的对象进行内置管理的潜在优势是非常困难的。在这种情况下,开发人员需要做出决定,并且应该基于项目的需求和便利性及其使用模式。查看了解更多信息

有关Asp.net中所有缓存技术的完整详细说明,以及每种技术的功能,请参阅

此外,这两个链接也是一个很好的起点:


使用Web API时,缓存的第一选择应该始终是在HTTP响应中设置缓存头<代码>HttpResponseMessage.CacheControlHeader


最后一个选项应该是依赖于
HttpContext
HttpRuntime
的任何内容,因为这会将您绑定到特定主机。Web API应用程序应独立于其主机进行构建。

关于
内存缓存与ASP.NET缓存:它们提供非常相似的功能。在ASP.NET 4应用程序中,我通常更喜欢ASP.NET缓存,如果没有其他原因,那么是因为,这在.NET 4.5中显然是固定的

静态字段适用于存储不需要过期策略的共享数据


应用程序状态只不过是一个静态字典,具有与经典ASP兼容的锁定语义——我只会使用它来向后兼容传统的经典ASP代码。

这取决于,你可以说你想做什么,但是,我不喜欢
应用程序
条目。我使用
IDictionary
进行预输入<代码>缓存
如果可以重新生成数据,就可以了。非常棒的概述!虽然您的评论主要针对asp.net网站,而不是webapi,但您列出的msdn web文章中有许多惊人的信息。@Interstar:链接通常停止工作。。。我试图在我的回答中尽可能多地包含细节。但不希望它太长太多。MSDN链接和第一个链接运行良好,包含了大部分有价值的信息。您还可以在Peter Johnson的博客上搜索此处的任何内容:not foundFix链接作者:P Johnson:您知道这些缓存方法是否在IIS工作线程超时期间保持不变吗?@vesuvious-是的,它们都将在请求超时期间保持不变:这样的超时对静态字段没有影响。当应用程序域被回收时,它们将被清除。你是说最后一个选项不应该被清除?@user20358我是说,在尝试使用mechani进行优化之前,你应该先尝试使用独立于主机的优化