缓存 ASP.NET MVC Web API 结果
Caching of ASP.NET MVC Web API results
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.
如果您使用网络 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();
}
}
您需要使用属性的 VaryByParam 部分 - 否则只有没有查询字符串的 URL 部分将被视为缓存键。
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.
如果您使用网络 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();
}
}
您需要使用属性的 VaryByParam 部分 - 否则只有没有查询字符串的 URL 部分将被视为缓存键。