我正在尝试在我的ASP.NET MVC网站中使用OutputCaching.问题是,当我尝试更改一个我的查询字符串参数的值时,它将返回所请求的第一个项目的数据!
这是我的代码(改变了param名称)......
[ApiAuthorize]
[HandleErrorAsJson]
public class SearchController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
[OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew)
{
..
}
}
Run Code Online (Sandbox Code Playgroud)
这是我正在做这个动作的两个示例调用: -
所以第一次调用的数据(foo = hello world,Pew Pew)返回200 OK.然后第二个api调用返回200 OK但使用前一个调用的数据.
此外,我没有使用任何代理服务器.如果我注释掉OutputCache属性,一切都很好.
我也尝试了以下(每次我需要缓存时手动列出).....
[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")]
Run Code Online (Sandbox Code Playgroud)
没运气 :(
请注意我需要确保将"Key"参数作为缓存唯一键的一部分包含在内.我不希望人们搜索相同的东西,但如果第二个人没有正确的密钥,他们不应该得到缓存的结果,而是一个错误信息(技术上,它是401未授权,但无论如何)...
思考?
我有一个基于CI 2.1.0构建的博客类应用程序.当我添加
$this->output->cache(5);
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,CI正确地缓存了页面,并且它可以快速加载.
我的问题是,如果有人对该帖子发表评论,则评论将在缓存过期后才会显示.
我想知道是否有人指出如何在每次特定页面发生更改时强制执行缓存刷新,或者是否进行了帖子编辑等.
提前致谢.
是否可以根据会话中的某些值改变MVC中的输出缓存?我已经阅读了很多关于使用varybycustom功能并覆盖Global.asax中的GetVaryByCustomString的内容,但此时会话不可用.
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "somekey")
//Want to check the session here (but it isn't available).
return base.GetVaryByCustomString(context, custom);
}
Run Code Online (Sandbox Code Playgroud)
我理解这是因为会话直到稍后在请求管道中才创建.
我担心的是,如果不根据用户的会话改变缓存,页面(根据用户在会话中的内容而改变,具有特定于该用户的其他HTML等)将被缓存(因为URL是相同的)并且由我们的负载均衡器,代理服务器等提供服务,然后在页面上与其他人的会话信息一起提供给其他请求!
URL相同的原因是用户以"访客"身份进入,输入一些信息(POST),这会被验证并存储在会话中,然后将它们重新定向回同一页面(现在应该是根据会话数据特定于用户).
页面本身应该正常缓存,因为如果"访客"访问相同的网址,它应该每次都提供相同的"标准"页面.
有可能以这种方式改变缓存吗?
我有一个Sitecore 7控制器渲染.我需要通过自定义方法改变OutputCache.
渲染当前在Sitecore中设置为"Cachable","VaryByData"和"VaryByParm".
我已经为我的操作添加了输出缓存属性,并设置了自定义变量字符串:
[OutputCache(VaryByCustom = "ThisIsATest", Duration = 60)]
public ActionResult Index()
{
...
}
Run Code Online (Sandbox Code Playgroud)
我的Global.asax继承自Sitecore.Web.Application,我已经重写了GetVaryByCustomString,如下所示:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "ThisIsATest")
return "some custom key";
return base.GetVaryByCustomString(context, custom);
}
Run Code Online (Sandbox Code Playgroud)
我从来没有看到过GetVaryByCustomString方法,并且控制器的行为似乎根本就没有OutputCache属性......就好像它实际上只是做了默认的"Cachable","VaryByData"," VaryByParm"来自Sitecore的行为.
有线索吗?
我有一个儿童行动方法.我可以使用OutputCache文件依赖吗?我只能看到SQLDependency属性System.Web.Mvc.OutputCacheAttribute.
我的 asp.net mvc 3 应用程序中有一个控制器操作。
我的操作包括数据库获取操作并将结果输出到视图中。我可以使用 OutputCache 操作过滤器属性将操作结果存储到缓存中。我还可以使用 MemoryCache 类来存储数据库获取操作的数据。它们都会显示缓存中的数据。OutputCache会将整个结果存储到缓存中。MemoryCache 类会将数据库获取结果存储到缓存中,并且该操作将从缓存中获取数据,而不是对相同结果发出新的数据库请求。
我的问题是申请哪一个更好?我有一种感觉,OutputCache 操作过滤器属性会很好地工作,因为它将数据库获取结果和操作结果都存储到缓存中。
我正在尝试为我的操作结果实现输出缓存.
在我的操作中,根据某些业务规则返回响应.在我的回复中,我发送错误代码.如果有任何错误,我不想缓存响应.
在行动结果中
class Response
{
public int ErrorCode { get; set; }
public string Message { get; set; }
}
[OutputCache(CacheProfile = "Test")]
public ActionResult Sample()
{
Response response = new Response();
return new JsonResult { Data = response, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
Run Code Online (Sandbox Code Playgroud)
我想只在ErrorCode == 0时缓存Result.
我尝试重写OutputCache,但它无法正常工作
public class CustomOutputCacheAttribute : OutputCacheAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is JsonResult)
{
var result = (JsonResult)filterContext.Result;
BaseReponse response = result.Data as BaseReponse;
if (!response.IsSuccess)
{ …Run Code Online (Sandbox Code Playgroud) 这不是我见过的问题,通常是“EPiServer 未清除输出缓存”。我正在努力实现相反的目标。每次发布一个页面时,整个缓存都会被删除,并且由于客户端每天发布数次,这令人沮丧。
我正在使用该[ContentOutputCache]属性并尝试httpCacheVaryByCustom在 EPiServer 中实现带有随附计划任务的规则,以便在我们决定将更新捆绑在一起并在预定时间失效时使缓存失效。
我已经测试了这条规则,它的工作原理是:
public override string GetVaryByCustomString(HttpContext context, string custom)
Run Code Online (Sandbox Code Playgroud)
我的印象是,通过使用这种类型的缓存规则,它会在发布/上传媒体时停止 EPiServer 转储我的缓存。
难道没有办法阻止这种情况发生吗?
我通过使用具有相同自定义字符串规则的标准 [OutputCache] 取得了成功,唯一的问题是编辑器将始终看到他们正在编辑的页面的缓存版本。
我在 EPiServer 的 web.config 中的应用程序设置是:
<applicationSettings globalErrorHandling="Off" operationCompatibility="DynamicProperties" uiSafeHtmlTags="b,i,u,br,em,strong,p,a,img,ol,ul,li" disableVersionDeletion="false"
httpCacheability="Public" uiEditorCssPaths="~/assets/css/styles.css, ~/assets/css/editor.css" urlRebaseKind="ToRootRelative"
pageUseBrowserLanguagePreferences="false" uiShowGlobalizationUserInterface="false" subscriptionHandler="EPiServer.Personalization.SubscriptionMail,EPiServer"
uiMaxVersions="20" pageValidateTemplate="false" utilUrl="~/util/"
uiUrl="~/EPiServer/CMS/" httpCacheExpiration="01:00:00" httpCacheVaryByCustom="invalidateSiteCache" />
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的简单的MVC3控制器动作
[HttpGet]
[OutputCache(Duration = 1200,Location=System.Web.UI.OutputCacheLocation.Server)]
public string GetTheDate()
{
return DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我从这样的jQuery Ajax中调用它
jQuery.ajax({
type: "GET",
url: "http://localhost:60690/Public/GetTheDate",
cache: false,
success: function (data) {
//alert("success");
jQuery("#stats").append("<b>" + data + "</b>");
},
error: function (req, status, error) { alert("failure"); alert(error + " " + status + " " + req); }
});
Run Code Online (Sandbox Code Playgroud)
问题是日期始终是当前日期,而不是缓存的响应.我的理解是,这[OutputCache( Location=Server)]意味着服务器(MVC应用程序)缓存响应,当客户端请求数据时,拦截操作以便不打扰DateTime.Now但返回缓存的响应.
我是错误地理解它还是只是做错了什么?
更新:
3nigma的答案是对的.VaryByParams="none"诀窍但是.....从我的方法中很明显我没有任何参数,所以我为什么要说"无".事实证明,'Params'我认为所提到的文档是我方法中的params实际上不是我方法中的参数,它们是请求处理程序可以解释为params的任何东西.
在MS文档说
当此属性设置为多个参数时,输出缓存包含每个指定参数的请求文档的不同版本.可能的值包括"none","*"以及任何有效的查询字符串或POST参数名称.
请参阅粗体位(我的重点),这意味着虽然我不期望任何查询字符串参数,如果有任何get发送(就像jQuery.ajax通过附加到请求时缓存:false的方式GET /Public/GetTheDate?_=1324047171837),那么有一个参数,无论我是否预料到.
我一直有奇怪的缓存问题,并将一个非常简单的.NET页面与输出缓存指令组合在一起.但是,页面不缓存(每次刷新时内容都会更新).
我在我的本地计算机(Windows 7)上安装了一个简单,最小的CMS(Ektron v.9.0 SP2)站点.在这个网站项目中,我创建了一个用于测试输出缓存的简单页面.这是页面代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CacheTest.aspx.cs" Inherits="CacheTest" %>
<%@ OutputCache Duration="3600" Location="Server" VaryByParam="None" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Cache Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p><%= DateTime.Now.ToString() %></p>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
此页面根本不缓存.
在我们的生产站点上,OutputCache通常也不起作用,除了在一个完全像上面配置的测试页面上.我无法弄清楚为什么一个页面是不同的,并且是唯一一个在开发服务器上工作但是当复制到我的localhost上运行的站点时,它不再起作用.
我注意到在我们的生产站点上,使用母版页似乎使输出缓存不起作用,尽管在这个localhost站点中我没有使用母版页但它仍然不起作用.
我应该从哪里开始寻找解决此问题的方法?我查看了IIS设置,找不到任何明显的设置来打开/关闭页面级缓存.我也广泛搜索过网络,似乎无法找到其他人.
outputcache ×10
caching ×5
asp.net-mvc ×3
c# ×2
.net ×1
asp.net ×1
codeigniter ×1
ektron ×1
episerver ×1
jquery ×1
memcached ×1
memorycache ×1
php ×1
sitecore ×1
sitecore7 ×1
varybyparam ×1