- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 OutputCache 属性在 ASP.NET MVC 4 中实现缓存。
这是我的 Controller Action :
[HttpGet]
[OutputCache(Duration = CACHE_DURATION, VaryByCustom = "$LanguageCode;myParam", Location = OutputCacheLocation.Server)]
public JsonResult MyAction(string myParam)
{
// this is called also if should be cached!
}
这是 Global.asax 中的 GetVaryByCustomString:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
var pars = arg.Split(';');
if (pars.Length == 0) return string.Empty;
var res = new System.Text.StringBuilder();
foreach (var s in pars)
{
switch (s)
{
case "$LanguageCode":
var culture = CultureManager.GetCurrentCulture();
res.Append(culture.Name);
break;
default:
var par = context.Request[s];
if (par != null)
res.AppendFormat(par);
break;
}
}
return base.GetVaryByCustomString(context, res.ToString());
}
此方法始终被调用并返回正确的值(例如 “it123”
)。
如果我使用唯一的 myParam
参数调用操作,缓存会正常工作。
http://localhost:1592/MyController/MyAction?myParam=123 // called multiple times always read from cache
问题是,当我使用另一个参数调用操作时,未包含在 VaryByCustom
字符串中,无论如何都会调用 Controller 操作,如果应该缓存并且 GetVaryByCustomString
返回相同的结果。
http://localhost:1592/MyController/MyAction?myParam=123&dummy=asdf // called multiple times with different 'dummy' values always calls the action
有什么想法吗?
最佳答案
首先,您必须更改 [OutputCache]
以包含 VaryByParam=""
:
[OutputCache(Duration = CACHE_DURATION, VaryByCustom = "$LanguageCode;myParam", VaryByParam = "", Location = OutputCacheLocation.Server)]
因为默认情况下它的值为 "*"
(全部)。
然后在您的 GetVaryByCustomString()
方法中,尝试返回您生成的字符串而不是调用基本方法:
return res.ToString();
这是 base.GetVaryByCustomString()
方法的源代码:
public virtual string GetVaryByCustomString(HttpContext context, string custom) {
if (StringUtil.EqualsIgnoreCase(custom, "browser")) {
return context.Request.Browser.Type;
}
return null;
}
如您所见,它并没有按照您的想法进行操作,它仅将浏览器类型与您提供的字符串进行比较,如果不匹配则返回 null
,而不是 您提供的字符串
。
(我怀疑单独更改 [OutputCache]
就足够了,但也尝试更改方法)
关于c# - 带有 VaryByCustom 的 OutputCache 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992661/
我很困惑... re this和 this “元”问题... 一个非常基本的http请求: GET http://stackoverflow.com/feeds/tag?tagnames=c%23&s
protected void Page_Load(object sender, EventArgs e) {Label1.Text = DateTime.Now.ToString();} 如果在我编译
在我的应用程序中,我会记住用户在 session 中选择的语言。问题是如果我使用输出缓存,那么更改语言功能将不起作用,因为当我根据 Session["lang"] 值从数据库中检索时它会缓存结果。 那
OutputCache is an easy way to improve performance在 ASP.NET <=4.6 MVC 中。我们应该将此属性应用于非常昂贵的操作,但在第一个请求和正在
我正在使用 OutputCache 属性 [OutputCache(Duration = 3600)] 来缓存返回 View 的 Controller 。但是该 View 包含一个 Helper 方法
我在 ASP.NET 4.0 Webforms 应用程序 (IIS 7.5) 上使用一个非常简单的输出缓存指令,该指令将页面缓存 1 小时。该应用程序没有任何内存压力,但页面在一小时之前就过期了。我创
我的 Controller 方法有以下缓存属性: [CacheOutput(ClientTimeSpan = 14400, ServerTimeSpan = 14400)] 我正在尝试清除缓存。然而
我在 ASP.net MVC 应用程序中使用 OutputCache。由于使用事件的 OutputCache 进行开发并不是很愉快,因此我想禁用开发系统(本地计算机和开发服务器)上的 OutputCa
我是一个为应用程序创建菜单的部分页面。我正在使用 renderaction 调用菜单部分 View 。我想通过这样做将这个部分页面存储在客户端 [OutputCache(Duration=7200,
我在某处读到,对于高流量站点(我想这也是一个模糊的术语),30 - 60 秒是一个不错的值。显然我可以进行负载测试并改变值,但我找不到任何类型的文档。大多数样本只有一分钟,几分钟。没有推荐范围。 ms
我正在尝试在我的 MVC 应用程序中使用 OutputCache 属性,但当我使用 OutputCacheLocation.Client 时它似乎不起作用: public class HomeCont
我在 MVC 5 中使用 OutputCache 来缓存服务器上的 View 。 我只想根据查询字符串中的两个参数缓存一个 View 。 操作方法 [HttpGet] [OutputCache(Loc
我遇到了一些奇怪的缓存问题,并将一个非常简单的 .NET 页面与输出缓存指令放在一起。但是,页面没有缓存(每次刷新时内容都会更新)。 我在我的本地机器(Windows 7)上安装了一个简单的、最小的
有人可以帮助解释什么是 OutputCache VaryByContentEncoding 的用途,或者更好地举例说明其用法。 我知道这与编码压缩有关。它会根据特定的压缩方案缓存不同的响应吗?我在网上
如果我将以下内容添加到我的应用程序/ Controller [OutputCache(Duration = 7200)] 我在网站上有两个用户,User1 和 User2。如果User1浏览到打开上述
假设我有一个页面请求,如下所示 http://localhost/accounting/products?id=234 有时它是这样的: http://localhost/accounting/pro
我能够正确利用 ASP.NET MVC4 OutputCache,并将以下代码作为我的 Controller Index() 上的属性: [OutputCache(Duration = 600, Va
对于我当前的项目,有必要生成动态 CSS... 所以,我有一个充当 CSS 交付者的部分 View ... Controller 代码如下所示: [OutputCache(CacheProfi
我不确定是什么原因造成的,但我们的 Controller 操作用于缓存其输出,但现在不再这样做了: [HttpGet] [OutputCache(VaryByParam = "slug", Durat
是否可以迭代 OutputCache 键?我知道您可以通过 HttpResponse.RemoveOutputCacheItem() 单独删除它们,但是有没有一种方法可以迭代所有键以查看集合中的内容?
我是一名优秀的程序员,十分优秀!