让我们说,理论上,我在我的网站上有一个页面/控制器动作,它做了一些非常重的事情.完成它的操作大约需要10秒钟.
现在,我使用.NET的outputcache机制将其缓存15分钟(例如,我使用[OutputCache(Duration = 900)])如果在15分钟后缓存过期并且100个用户在10秒内再次请求页面执行该操作,会发生什么情况重处理?
很容易问题,但我不是百分百肯定.我希望它是第一,但是:-)
谢谢!
我在我的MVC网站中使用OutputCache属性如下:
[OutputCache(Duration = 5000,
VaryByParam = "name;region;model;id;op;content;featured;isStarred;page;size;")]
Run Code Online (Sandbox Code Playgroud)
但有时我想完全绕过输出缓存并强制从数据库中获取.对于我不断将新数据加载到数据库进行测试的测试环境,尤其如此.
无论如何我在这种情况下可以绕过缓存吗?
谢谢.
我已经将OutputCache设置为在我的ASP.net ASPX页面中包含'VaryByContentEncodings ="gzip"'.我希望页面提供不同的css文件,如果浏览器支持它则进行gzip,如果浏览器不支持压缩,则需要常规非压缩文件.
例:
<%@ OutputCache Duration="320" VaryByParam="none" VaryByContentEncodings="gzip" %>
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我收到以下错误:
页面中的'outputcache'指令不支持'varybycontentencodings'属性.
我不知道问题是什么,为什么它不起作用.其次,你认为通过提供不同的gzip /非压缩CSS我做的是正确的.请注意,这些文件是从Amazon S3提供的,因此我不能依靠IIS或.NET引擎自动返回压缩文件.这就是为什么我想要分离页面的缓存版本.
在这似乎没关系,但它不起作用(使用ASP.NET 4.5):
http://msdn.microsoft.com/en-us/library/system.web.httpcachevarybycontentencodings.aspx
非常感谢帮助.
我正在修复ASP.NET OutputCache的一个错误,它让我疯了.我们希望在服务器上进行缓存,但它似乎不起作用(它在不久之前,在我们的应用程序的旧版本中,但我们最近意外地发现了该错误).
在本地,我无法让缓存在服务器端工作.使用此属性:
[OutputCache(CacheProfile = "MyProfile", Location = OutputCacheLocation.Server)] // doesn't work
Run Code Online (Sandbox Code Playgroud)
现在,根据我通过谷歌搜索阅读的一些内容,这里可能是相关的信息:
VaryByParams价值观,没有任何作用.我已经开了一个perfmon会议,并从增加了一些柜台Web Service Cache组,我看到的是,有被缓存的URL,但缓存错过:
我们现在面临的更大问题/错误是OutputCache现在无法正常工作.我们能够通过指定VaryByParams=""(空字符串)来解决这个问题.这是为客户做的.但它还不适用于服务器端.
我实际上是通过在应该缓存的操作中放置调试断点来检查它是否有效.它每次都被击中,这应该意味着缓存没有被击中.
我的MVC控制器中有以下代码:
[HttpGet]
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "app")]
public async Task<ViewResult> Index(string r)
{
// Stuff...
}
Run Code Online (Sandbox Code Playgroud)
我在Global.asax.cs类中有以下GetVaryByCustomString实现:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
switch (arg.ToLower())
{
case "app":
return context.Request.Url.Host;
default:
return base.GetVaryByCustomString(context, arg);
}
}
Run Code Online (Sandbox Code Playgroud)
在我们的应用程序中,客户将拥有自己的子域(即johndoe.app.com,janedoe.app.com).
所以缓存应该在子域上有所不同.
但是,该完全限定URL上的任何"路径"都应共享相同的缓存.所以下面应该读取相同的输出缓存:
有一个令人筋疲力尽的原因,为什么会这样,但简而言之,它是一个SPA应用程序,而"路径"实际上只是一个跟踪器.这不能更改为查询字符串.
当路径(跟踪器)改变时,新访问索引方法.我可以通过调试器告诉我.作为注释,GetVaryByCustomString仍然会被调用,但是在处理完Index方法之后调用它.
如何根据子域更改缓存,但是无论URL上的路径(跟踪器)如何,都使用该缓存?
如果它提供任何有益的东西,这是我的MVC路线:
routes.MapRoute(
name: "Tracker",
url: "{r}",
defaults: new { controller = "Home", action = "Index", id = "" });
routes.MapRoute(
name: "Default",
url: …Run Code Online (Sandbox Code Playgroud) 我的网站页面由两种内容组成.第一个是用户之间的变量,但对于所有页面都是常量.第二个是跨用户不变的,但在页面之间是可变的.这是一种常见的布局.将输出缓存应用于此类内容的最佳方法是什么?
据我了解,Html.Substitute助手与MVC2渲染管道不兼容,消除了旧的圆环缓存方式.
特异性水平会降低输出缓存的价值.同一用户不太可能在缓存输出的生命周期内多次查看同一页面.
互联网上有几次尝试,它们修改OutputCache属性并渲染子系统以支持替换.我发现的最好的就是这里.
但是,我发现的各种片段似乎都是非正式的实现,并且得不到很好的支持.另外,我倾向于怀疑如果将替换添加回MVC2管道那么容易,那就完成了.
action方法不会使用OutputCache属性进行标记,并且会返回一个包含多个Html.RenderAction调用的视图,这些调用将独立地引入缓存的内容.除了使用稍微重量级的含义之外RenderAction,它还会增加额外的间接层和代码味道.
您在MVC2中独立编写缓存内容的经历是什么?什么运作良好,什么没有?
outputcache partial-views donut-caching renderaction asp.net-mvc-2
这个问题与我的另一个问题有关.
我有一个MVC应用程序,禁用所有控制器操作的缓存.我这样做是通过设置缓存响应头Application_BeginRequest:
protected void Application_BeginRequest()
{
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
}
Run Code Online (Sandbox Code Playgroud)
有一个控制器操作我想要启用缓存.我用这个OutputCache属性装饰了这个动作:
[OutputCache(Duration = 300, VaryByParam = "id")]
Run Code Online (Sandbox Code Playgroud)
现在这个动作会发生什么?它是否因为OutputCache属性而被缓存,还是因为响应头而没有缓存?
- 编辑 -
看起来,响应标头优先.所以我的问题变成:如何为单个控制器操作启用缓存?再次覆盖响应头?
我正在编写一个ASP.NET MVC站点,其中包括用户创建帐户和登录的可能性.由于我还想积极地缓存该站点,我在将缓存与身份验证混合时遇到了一些麻烦.
在每个页面的顶部,如果用户已登录,我会输出其用户名,指向其个人资料的链接以及注销链接.如果他们没有登录,我输出一个标准的登录链接.此外,在页面本身中,某些内容不会显示给未经身份验证的用户,而其他内容则取决于登录的用户.
我前一次尝试通过询问Stack Overflow团队如何解决问题来解决这个问题.杰夫回答说,对于未经身份验证的用户,他们基本上根本没有缓存.因此,我编写了一个派生自OutputCacheAttribute的属性,但如果用户已登录则取消缓存.
目前,我正在使用该属性,但在某些情况下我得到的结果不正确.例如,用户可以访问某个页面,然后登录,然后再次访问该页面,只能看到顶部的登录链接,而不是他们的用户名.
以下是我正在考虑的一些解决方案:
HttpCacheability或Cache-Control键入private,而不是public.这样,响应仅缓存在客户端.这会解决这个问题吗?如果是这样,这会对缓存效率产生影响吗?但是,我注意到Stack Overflow似乎正在使用public.提前致谢!
我使用以下输出缓存配置文件:
<add name="MyFunkyProfile" duration="180" varyByParam="*" location="ServerAndClient" />
Run Code Online (Sandbox Code Playgroud)
在dev中,我有一个带有一个Vary条目的响应头:
HTTP/1.1 200 OK
Server: Microsoft-IIS/7.5
...
Vary: Accept-Encoding
Cache-Control: private, max-age=180, s-maxage=0
...
Run Code Online (Sandbox Code Playgroud)
当我部署我的应用程序时,我在响应中插入了额外的Vary条目:
HTTP/1.1 200 OK
Server: nginx
...
Vary: Accept-Encoding
Cache-Control: private, max-age=180, s-maxage=0
...
Vary: *
...
Run Code Online (Sandbox Code Playgroud)
为什么这个额外的Vary条目?这会阻止缓存正常工作.
任何想法如何解决这一问题?
asp.net-mvc outputcache http-headers asp.net-mvc-3 appharbor
有没有办法根据cookie值设置OutputCache的值?
为了简单起见,这是我的方法
[OutputCache(Duration = 600, VaryByParam = "None", VaryByCustom = "ztest")]
public ViewResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
我的Global.asax有这个(为了覆盖GetVaryByCustomString方法
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "ztest")
{
HttpCookie ztest = context.Request.Cookies["ztest"];
if (ztest != null)
{
return ztest.Value;
}
}
return base.GetVaryByCustomString(context, custom);
}
Run Code Online (Sandbox Code Playgroud)
我可以验证我的浏览器是否有ztest cookie,但是当我调试Index方法时,我每次都会遇到断点(意味着缓存不起作用).
HttpResponse没有出站cookie,所以这一点不适用:https://msdn.microsoft.com/en-us/library/system.web.httpcookie.shareable(v=vs.110).aspx
如果给定的HttpResponse包含一个或多个出站cookie,并且Shareable设置为false(默认值),则将抑制响应的输出缓存.这可以防止包含潜在敏感信息的cookie缓存在响应中并发送到多个客户端.要允许缓存包含cookie的响应,请为响应正常配置缓存,例如使用OutputCache指令或MVC的[OutputCache]属性,并设置所有出站cookie以使Shareable设置为true.
outputcache ×10
asp.net-mvc ×7
caching ×6
asp.net ×5
c# ×4
.net ×2
appharbor ×1
cookies ×1
encoding ×1
http-headers ×1
iis ×1
renderaction ×1