我希望能够为用户通过GET请求下载的某些项目设置很长的到期时间.
我想说'这有利于10分钟'(即我想设置一个Expires标头+10分钟).请求是通过AJAX在页面中显示的HTML片段,它们对用户的会话很有用.我不想回到服务器并获得304,如果他们再次需要它们 - 我希望浏览器缓存立即给我相同的项目.
我发现了一篇关于MVC Action过滤器缓存和压缩的文章已有近一年的历史.这将创建一个自定义ActionFilter来更改过期标头.我已经在使用压缩过滤器,它对我正在生成的一些自定义css非常有效(压缩率为94%!).
我有两个主要问题:
1)我真的必须使用这种方法.如果我这样做的话,我很好,但MVC或OutputCache功能中是否真的没有为我做这个功能?在'传统'ASP.NET中,我总是手动设置Expires头,但我们不能再这样做了 - 至少在控制器中不行.
2)如果我使用这种过滤方法 - 是否会干扰OutputCache策略 - 我希望能够在web.config中控制它.我有点认为这两者是相互排斥的,你不会想要两者 - 但我不完全确定.
我正在使用输出缓存来登录带有登录系统的网站.我有全局页面,每个用户都可以访问.这些页面被缓存并使用母版页.
<%@ OutputCache Duration="3600" VaryByParam="none" VaryByCustom="userid" %>
Run Code Online (Sandbox Code Playgroud)
我在会话中存储用户登录详细信息.我的global.asax文件在这里:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
string result = String.Empty;
if (arg == "userid")
{
object o = Session["UserID"];
if (o != null) { result = o.ToString(); }
}
else { result = base.GetVaryByCustomString(context, arg); }
return result;
}
Run Code Online (Sandbox Code Playgroud)
我在母版页面中有一个面板,对于经过身份验证的用户可见.当用户登录并查看公共页面时,另一个访客用户也会在页面A上看到经过身份验证的用户面板.如果访客首先查看页面A,则经过身份验证的用户不会在页面A上看到面板.
我的代码的哪一部分是错的?我第一次使用VaryByCustom.
编辑
我已经像这样修改了我的global.asax,但是文本文件中没有写入:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
string result = String.Empty;
FileInfo t = new FileInfo(Server.MapPath("App_Data\\debug.txt"));
StreamWriter Tex = t.AppendText();
Tex.WriteLine("GetVaryByCustomString: " + arg); …Run Code Online (Sandbox Code Playgroud) 我做了我的研究,但没有找到任何答案.
我在主页中使用Html.RenderAction(用于呈现具有特定于用户权限的链接的页眉).Action使用OutputCache修饰,返回部分控件并按预期缓存.
当事件发生时(假设权限已更改)我想以编程方式使缓存的部分控件无效.
我正在尝试使用RemoveOutputCacheItem方法.它将路径作为参数.我正在尝试设置Html.RenderAction中使用的操作的路径.这不会使行动失效.
如何以编程方式使操作无效?
谢谢
在创建ASP.Net MVC 3.0应用程序时,我可以在操作中包含OutputCache属性,并定义缓存将持续的持续时间.在此持续时间之后,导致触发操作的任何活动都将导致此缓存结果被丢弃和刷新.
我的问题是......这个缓存输出是否对所有用户会话都是全局的,或者是特定于每个会话的缓存选项.换句话说,如果user1发出请求,其中具有OutputCache属性的操作设置为1小时,则在中午(中午12:00)开始请求.User2向同一个动作发出请求,但是在中午30点(下午12:30).两个用户的缓存结果是否相同,如果是这样,user2的缓存输出是否会在下午1:00刷新?
有没有办法以编程方式填充asp.net输出缓存?我已经调查了缓存API,似乎找不到明显的方法来做到这一点.有没有人尝试过这样的东西?如果是这样,你使用了什么方法?
我目前在ASP.NET MVC 3应用程序中使用存储库模式.
我使用OutputCache通过使用类似于此的数据注释装饰我的控制器方法来减轻数据库的负载:
[OutputCache(Duration = 3600, VaryByParam = "userName")]
Run Code Online (Sandbox Code Playgroud)
最终,我想要实现的是一种缓存级别,数据被缓存直到它被更新(即它发生变化).我正在使用Entity Framework 4.1 for ORM.
使用我选择的堆栈建议的方法是什么?
asp.net-mvc caching outputcache entity-framework-4.1 asp.net-mvc-3
我们使用ASP.NET MVC 3和AppFabric作为分布式缓存解决方案运行相当大的站点构建.我们已经实现了一个自定义OutputCacheAdapter来使用我们的AppFabric集群.
我们看到ASP.NET为每个操作调用OutputCacheProvider.Get()方法,即使该操作未使用@OutputCacheAttribute进行修饰.
如果您使用默认的outputcacheprovider,那就不是什么问题,但是当您运行驻留在单独机器上的outputcacheprovider时.
我是MVC的初学者,我有一个项目,从MVC2转换到最新版本的MVC.我读了一些关于MVC 4的书,所以我开始理解主要的机制.
但是,在转换我的MVC 2解决方案时,我遇到了一个属性问题:OutputCache.
通过例如.我有多个这样的动作(属性可能会有所不同):
[OutputCache(CacheProfile = "ProductImage")]
public ActionResult GetImage(Guid elementId, int imgtype)
Run Code Online (Sandbox Code Playgroud)
在Web.Config我有"缓存> outputCacheSettings> outputCacheProfiles>":
<add name="ProductImage" duration="5" varyByParam="elementId,imgtype" />
Run Code Online (Sandbox Code Playgroud)
并在输出中获取以下异常:
子操作的OutputCacheAttribute仅支持Duration,VaryByCustom和VaryByParam值.请不要为子操作设置CacheProfile,Location,NoStore,SqlDependency,VaryByContentEncoding或VaryByHeader值.
据我所知,问题只出现在儿童行动中.
介绍问题
我们已成功配置浏览器缓存,以便在服务器指示时返回已保存的响应304 Not Modified.这是配置:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add
name="TransparentClient"
location="Client"
duration="0" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Run Code Online (Sandbox Code Playgroud)
web.config是完美的,并设置Cache-control:private, max-age=0为:
问题是我们的MVC.NET动作总是响应200而不是304.
问题
当ActionResult没有改变时,我们如何配置输出缓存以返回304 Not Modified?
roll-our-own可能需要一个带ETag或Last-Modified的动作过滤器.
屏幕截图
这是一个显示缺少304的Fiddler截图.

搜索和研究
ASP.NET MVC:如何返回304"未修改"状态?提到从Action中返回304.这没有提供使OutputCache准确响应304的方法.
使用输出缓存和其他操作过滤器显示如何覆盖OnResultExecuted,这将允许添加/删除标头.
我想在asp.net core 2.0中使用服务器端响应缓存(输出缓存)并找到有关响应缓存中间件的信息,并希望尝试使用全新的asp.core mvc项目.
这是上面链接的描述,这让我觉得这可以像输出缓存一样使用.
中间件确定响应何时可缓存,存储响应以及从缓存提供响应.
这是我的startup.cs的样子.
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCaching();
if (env.IsDevelopment())
{ …Run Code Online (Sandbox Code Playgroud)