我正在构建一个ASP.NET MVC 2站点,我正在大量使用OutputCache参数.但是,我有一个问题:使用这样的缓存可能会干扰身份验证.
在我的所有页面上,我显示用户是否已登录.此外,在我的一些视图中,我根据用户角色进行过滤,以确定是否显示某些页面内容(例如,我的某个页面上的" 编辑"链接仅显示给主持人或管理员角色的用户) .
是否会使用OutputCache干扰我的视图的动态更改?如果是这样,如何在不消除缓存的情况下解决此问题?
我正在尝试利用.Net MVC 3中的甜甜圈缓存功能.对于我的主页,在我的家庭控制器中,我有:
public ActionResult Index()
{
return View();
}
[ChildActionOnly]
[OutputCache(Duration=3600)]
public ActionResult IndexMain()
{
return PartialView(ViewModelRepository.GetIndexViewModel());
}
Run Code Online (Sandbox Code Playgroud)
我的观点,我有:
<% Html.RenderAction("IndexMain");%>
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,当数据发生变化时,我运行:
var urlToRemove = Url.Action("IndexMain", "Home");
Response.RemoveOutputCacheItem(urlToRemove);
Run Code Online (Sandbox Code Playgroud)
RemoveOutputCacheItem执行时没有错误,但ChildAction缓存未失效.有没有办法以编程方式从ChildAction中删除缓存项?
我对ASP.NET输出缓存缺乏一点基本的了解.
就我而言,我的资源与我的VaryByCustom密钥密切相关.在服务器端,我喜欢这些密钥无限期地缓存,直到密钥发生变化.这些缓存条目没有理由在计时器上清除.
但是,客户应该每小时检查一次,以获得服务器认为最新鲜的内容.
如果我将持续时间设置为1小时,我知道在客户端上正确设置了过期标头.但它是否也驱逐了服务器端缓存?有没有办法确保响应保持缓存在服务器上,直到我的VaryByCustom更改,但仍然允许更频繁的客户端到期?
我正在开发一个服务于多个域的asp.net mvc 3站点.因此,基于域我显示不同的内容.
例如,如果它的www.domain1.com,在主页我显示3个图像和一些文本.如果它在主页上的www.domain2.com我只显示文字.
我实现了一个名为FileOutputCache的自定义输出缓存提供程序,它将缓存的页面保存到文件中,我想在这个项目中使用它.但我有一个大问题,我没有访问请求,也没有访问主机...
这是一个操作:public override object Add(string key,object entry,DateTime utcExpiry);
您可以看到我无法访问主机,并且密钥不依赖于它...因此,如果我部署该站点并且第一个用户进入www.domain1.com,它将呈现并缓存包含3个图像的页面和文本....如果另一个用户进入www.domain2.com,它将显示3图像和文字:(
有谁知道如何在我的自定义输出缓存提供程序中区分请求的主机?
提前致谢!胡安
我正在阅读一本关于MVC2的书,并在OutputCache部分中说明:
警告在前面的"授权过滤器如何与输出缓存交互"一节中,我解释说[授权]具有特殊行为,以确保未经授权的访问者只是因为它已经被缓存而无法获取敏感信息.但是,除非您明确地阻止它,否则缓存输出仍然可以传递给与最初生成它的用户不同的授权用户.防止这种情况的一种方法是将特定内容项的访问控制实现为授权过滤器(派生自AuthorizeAttribute),而不是简单地在操作方法中内联强制授权逻辑,因为AuthorizeAttribute知道如何避免被输出缓存绕过.仔细测试以确保授权和输出缓存以您期望的方式进行交互.
这在MVC3中仍然如此吗?
如果是肯定的,有什么方法可以防止这种情况发生?(因为书中的解释太模糊了).
问候.
我有一个Web用户控件,它提供一些潜在的密集数据计算,我希望它被输出缓存,以便每个页面视图不会重新计算数据.它驻留在经常查看的页面上,因此我认为它正常工作非常重要!
对于上下文,它在我们的街机上使用:http: //www.scirra.com/arcade/action/93/8-bits-runner
单击统计信息,将从此webusercontrol生成图形和统计数据.
控制的开始如下:
public partial class Controls_Arcade_Data_ArcadeChartData : System.Web.UI.UserControl
{
public int GameID { get; set; }
public Arcade.ChartDataType.ChartType Type { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
Run Code Online (Sandbox Code Playgroud)
现在我遇到的困难是输出缓存需要依赖于GamID和ChartType.
这个控件重复使用GameID和类型的许多不同组合,我需要它为每个组件创建一个缓存,但我很难找到如何做到这一点.
例如,一个街机游戏可能传递GameID = 93和Type = GraphData,另一个可能是GameID = 41和Type = TotalPlaysData而另一个可能是GameID = 93,但Type = TotalPlaysData.这些都应该返回不同的数据并具有不同的输出缓存.
该控件用于游戏页面,类似于此(参数实际上是在代码隐藏中设置的)
<div>Total Plays:</div>
<div class="count"><Scirra:ArcadeChartData runat="server" GameID="93" Type="TotalPlays" /></div>
<br /><br />
<div>Total Guest Plays:</div>
<div class="count"><Scirra:ArcadeChartData runat="server" …Run Code Online (Sandbox Code Playgroud) 最近几天我想到了asp.net中的输出缓存.在我的任务中,我需要为这个非常大的项目实现输出缓存.经过几个小时的搜索,我没有找到任何例子.
最流行的使用输出缓存的方式是声明性的,在这种情况下,您需要在要缓存的页面上编写类似这样的内容.
但是,如果您需要缓存整个站点,则必须在项目的所有页面或母版页上编写此文件.这很疯狂.在这种情况下,您无法将所有配置存储在一个位置.所有页面都有自己的配置..
Global.asax可以帮助我,但我的网站包含大约20个web progects和~20个global.asax文件.而且我不想为每个项目复制相同的代码.
出于这些原因,我决定创建HTTPModule.在Init方法中,我订阅了两个事件:
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute += new EventHandler(OnApplicationPreRequestHandlerExecute);
app.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);
}
Run Code Online (Sandbox Code Playgroud)
在方法"OnPostRequestHandlerExecute"中,我为每个新请求设置输出缓存参数:
public void OnPostRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpCachePolicy policy = app.Response.Cache;
policy.SetCacheability(HttpCacheability.Server);
policy.SetExpires(app.Context.Timestamp.AddSeconds((double)600));
policy.SetMaxAge(new TimeSpan(0, 0, 600));
policy.SetValidUntilExpires(true);
policy.SetLastModified(app.Context.Timestamp);
policy.VaryByParams.IgnoreParams = true;
}
Run Code Online (Sandbox Code Playgroud)
在"OnApplicationPreRequestHandlerExecute"方法中,我将calback方法设置为缓存验证:
public void OnApplicationPreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
app.Context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), app);
}
Run Code Online (Sandbox Code Playgroud)
最后一部分 - 回调验证方法:
public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
if (context.Request.QueryString["id"] == …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OutputCache属性在ASP.NET MVC 4中实现缓存.
这是我的控制器动作:
[HttpGet]
[OutputCache(Duration = CACHE_DURATION, VaryByCustom = "$LanguageCode;myParam", Location = OutputCacheLocation.Server)]
public JsonResult MyAction(string myParam)
{
// this is called also if should be cached!
}
Run Code Online (Sandbox Code Playgroud)
这是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); …Run Code Online (Sandbox Code Playgroud) 我使用的是Microsoft RedisOutputCacheProvider,并且有一个非常简单的PartialView,它通过以下方式基于当前用户的SessionId进行缓存VaryByCustom:
[OutputCache(VaryByCustom = "User", Duration = 3600)]
[ChildActionOnly]
public ActionResult Notifications()
{
return PartialView("Partials/Notifications");
}
Run Code Online (Sandbox Code Playgroud)
这可以很好地工作并按预期进行缓存,但是我想从另一个页面手动使此OutputCache过期。我试过了:
Response.RemoveOutputCacheItem("/Controller/Notifications");
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。我也无法通过Redis存储或后端代码看到任何OutputCache键,但是我绝对可以看到正在缓存的视图。
我有下面的代码,并希望Duration在[OutputCache(Duration = 10)]行有一个变量的值,这样我可以从阅读DB或从List收藏.
而且我希望能够立即复位服务器缓存中,当Duration发生了变化.
如何在更改时更改Duration缓存HTML数据Duration?这是我的代码.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Cache_Example.Controllers
{
public class HomeController : Controller
{
// GET: Home
// [OutputCache(Duration = 10)]
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 10)]
public ActionResult ShowDate()
{
return PartialView();
}
}
}
Run Code Online (Sandbox Code Playgroud) outputcache ×10
asp.net ×5
asp.net-mvc ×5
c# ×5
caching ×4
duration ×1
httpmodule ×1
iis-7.5 ×1
redis ×1