c# - 缓存 ASP.NET MVC Web API 结果

标签 c# asp.net-mvc caching outputcache

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

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

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

最佳答案

使用 fiddler 查看 HTTP 响应 - 可能 Response Header 有: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();
      }
}

关于c# - 缓存 ASP.NET MVC Web API 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39327231/

相关文章:

c# - MySql .Net Connector 似乎将错误的类型返回给 DataTable

java - Tomcat中的PreparedStatement缓存

java - Java多线程—如果我们有共享堆,为什么我们需要查看主内存(RAM)?

c# - 按元素的内容和长度对列表进行排序

c# - MySQL 适配器填充异常

c# - 如何将可空类型隐式转换为不可空类型

c# - 为由多个数据库表组成的 View 创建 ViewModel (MVC 4)

asp.net-mvc - 有没有一种方法可以在服务堆栈中缓存 Razor 页面?

asp.net-mvc - asp.net mvc 压缩流并删除空格

c# - 保存搜索状态