【问题标题】:Caching of ASP.NET MVC Web API results缓存 ASP.NET MVC Web API 结果
【发布时间】:2016-09-05 09:08:38
【问题描述】:
public class ValuesController : ApiController
{
   [System.Web.Mvc.OutputCache(Duration = 3600)]
   public int Get(int id)
   {
       return new Random().Next();
   }
}

由于缓存设置为 1 小时,我希望 Web 服务器会为具有相同输入的每个请求继续返回相同的数字,而无需再次执行该方法。但事实并非如此,缓存属性没有任何作用。我做错了什么?

我使用 MVC5,并从 VS2015 和 IIS Express 进行了测试。

【问题讨论】:

标签: c# asp.net-mvc caching outputcache


【解决方案1】:

使用 fiddler 查看 HTTP 响应 - 可能响应标头有:Cache-Control: no cache

如果您使用 Web API 2,那么:

改用 Strathweb.CacheOutput.WebApi2 可能是个好主意。那么你的代码将是:

public class ValuesController : ApiController
{
   [CacheOutput(ClientTimeSpan = 3600, ServerTimeSpan = 3600)]
    public int Get(int id)
      {
        return new Random().Next();
      }
}

否则你可以尝试使用自定义属性

  public class CacheWebApiAttribute : ActionFilterAttribute
  {
      public int Duration { get; set; }

      public override void OnActionExecuted(HttpActionExecutedContext    filterContext)
       {
          filterContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
          {
             MaxAge = TimeSpan.FromMinutes(Duration),
             MustRevalidate = true,
             Private = true
          };
        }
      }

然后

public class ValuesController : ApiController
{
   [CacheWebApi(Duration = 3600)]
    public int Get(int id)
      {
        return new Random().Next();
      }
}

【讨论】:

  • 我选择了自定义属性。效果很好。谢谢!
  • 很高兴能帮上忙)
【解决方案2】:

您需要使用 Attribute 的 VaryByParam 部分 - 否则只有没有查询字符串的 URL 部分将被视为缓存键。

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多