【问题标题】:How to use caching in ASP.NET Web API?如何在 ASP.NET Web API 中使用缓存?
【发布时间】:2013-01-26 12:47:25
【问题描述】:

我正在使用带有 WEB API 的 ASP.NET MVC 4

我有以下操作,在下面显示的操作中,我的服务方法对 DoMagic() 方法进行 db 调用并返回一个整数值,然后我在每个页面上使用该值,此操作使用 ajax 调用来调用。

以下是我的 WEB API 操作:

[OutputCache(Duration = 86400, VaryByParam = "none")]
[ActionName("GetMyMagicNumber")]
public int GetMyMagicNumber()
{
    if (WebSecurity.IsAuthenticated)
    {
        var revenue = _magicService.DoMagic();
        return revenue;
    }
    return 0;
}

我的问题:我曾尝试使用[OutputCache(Duration = 86400, VaryByParam = "none")],但我只是在第一次调用 db 时以及对该操作的下一次后续请求将返回缓存值,但这并没有发生。

再次进行 db 调用,db 调用需要时间我如何使其正常工作?

【问题讨论】:

标签: c# asp.net-web-api http-caching


【解决方案1】:

很遗憾,缓存没有内置到 ASP.NET Web API 中。

看看这个让你走上正轨:http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

此处更新资源:https://github.com/filipw/AspNetWebApi-OutputCache

编辑:截至 2020 年 2 月 3 日,即使这个答案已经很老了,它仍然有效。

以上两个网址都指向同一个项目,ASP.NET Web API CacheOutput by Filip W

【讨论】:

  • 链接断开,请务必使用必要的信息更新答案
  • @pranesh-janarthanan 什么链接坏了?两者都对我有用。也许您在公司防火墙后面?
  • 今天早上,当我试图打开第一个链接strathweb时,它响应错误,我很好地用代码回答而不是只指定参考链接。
  • @PraneshJanarthanan 我同意,但是通过从开源 github 项目中的一堆文件中发布数千行代码来回答并不是一个好习惯。
  • 如果 GitHub 存储库被删除并且库从 Visual Studio Marketplace 中删除,sn-p 将没有用。而且由于这个问题是一个普遍的问题,sn-p 很快就会过时,因为它不会随着官方文档的发展而自动改变。虽然我大体上同意,但这是一个典型的情况,即 sn-p 根本没有增加任何价值。
【解决方案2】:

在您的项目中添加对 System.Runtime.Caching 的引用。 添加辅助类:

using System;
using System.Runtime.Caching;


public static class MemoryCacher
{
    public static object GetValue(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Get(key);
    }

    public static bool Add(string key, object value, DateTimeOffset absExpiration)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Add(key, value, absExpiration);
    }

    public static  void Delete(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        if (memoryCache.Contains(key))
        {
            memoryCache.Remove(key);
        }
    }
}

然后从您的代码中获取或设置缓存中的对象:

list = (List <ChapterEx>)MemoryCacher.GetValue("CacheItem1");

MemoryCacher.Add("CacheItem1", list, DateTimeOffset.UtcNow.AddYears(1));

【讨论】:

  • Web API 是服务器端的。因此,服务器端缓存解决方案。
  • 赞成投票,因为我不熟悉“内存缓存”这个术语;)
  • 发现这是目前 Web API 2.2 的最佳解决方案非常有意义,因为一旦请求进入,它基本上由 Sagi 提到的服务器端处理。
  • 仅供参考,您需要设置一些 HTTP 标头。当然是 Cache-Control 和 MaxAge,但最重要的是 NoStore 标头。如果您不需要它,则没有必要,但在复杂的 REST API 中,响应内容是根据当前用户过滤和处理的,而不是任何查询字符串参数,确保您没有提供无效数据非常重要给您的用户。假设您使用某个用户登录,请求资源并获取您的数据,然后使用第二个用户登录并从第一个用户那里获取缓存的内容。这将是一场灾难性的失败。测试你的缓存条目:)
  • @Sangeeta 什么都没有。直接使用MemoryCache即可。
【解决方案3】:

正如 OakNinja 已经提到的,ASP.NET Web API 目前不支持通过 [OutputCache] 属性进行的输出缓存。

但是,有一些开源实现填补了这一空白:

Strathweb.CacheOutput

一个将缓存选项(类似于 MVC 的“OutputCacheAttribute”)引入 Web API 操作的小型库。

Github:https://github.com/filipw/Strathweb.CacheOutput
许可证:Apache v2

CacheCow

在 ASP.NET Web API 中为客户端和服务器端实现 HTTP 缓存。

Github:https://github.com/aliostad/CacheCow
许可证:麻省理工学院

有一个很好的blog post by Scott Hanselmann 涵盖了这两个功能集。

【讨论】:

  • 是否可以不向 http 请求添加特定的标头,以通知客户端如果需要,他们可以缓存此请求?
  • @Zapnologica:问题和答案都集中在服务器端缓存上。您提到的是客户端缓存。为了获得最佳体验,您应该同时使用这两种技术。
  • 没有具体提到服务器端缓存?据我所知,OP 使用的属性在 MVC 中都有吗?不过要注意一点。
  • 看起来 CacheCow 现在支持属性路由。 github.com/aliostad/CacheCow/commit/…
【解决方案4】:

[ResponseCache] 现在在 ASP.NET Core 中得到支持

功能可能看起来与[OutputCache] 相同,但[ResponseCache] 仅适用于客户端。

响应缓存将与缓存相关的标头添加到响应中。这些标头指定您希望客户端、代理和中间件如何缓存响应。

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response

[ResponseCache(Duration = 3600)]
[HttpGet]
public IEnumerable<Product> Get()
{
  return _service.GetAll();
}

【讨论】:

  • [ResponseCache] 不是 [OutputCache] 等效的,它只是通过在响应中添加与缓存相关的标头来缓存客户端的内容。这将减少客户端或代理向 Web 服务器发出的请求数量。 [ResponseCaching] 不会在 Web 服务器上缓存响应。
  • 我还要添加这是针对 .Net Core 的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多