61

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

我有以下操作,在下面显示的操作中,我的服务方法对方法进行 db 调用DoMagic()并返回一个整数值,然后我在每个页面上使用该整数值,使用 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 调用需要时间我如何让它工作?

4

4 回答 4

56

不幸的是,缓存没有内置到 ASP.NET Web API 中。

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

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

编辑:截至 2020-02-03,即使这个答案已经很老了,它仍然有效。

上面的两个 URL 都指向同一个项目,由Filip W编写的ASP.NET Web API CacheOutput

于 2013-02-11T12:28:32.083 回答
35

在项目中添加对 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));
于 2017-02-22T14:45:45.927 回答
18

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

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

Strathweb.CacheOutput

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

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

缓存牛

用于客户端和服务器端的 ASP.NET Web API 中的 HTTP 缓存实现。

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

Scott Hanselmann有一篇不错的博客文章涵盖了这两个功能集。

于 2014-11-20T12:57:16.303 回答
7

[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();
}
于 2017-01-25T23:22:27.963 回答