gpt4 book ai didi

c# - 取消 ChildAction 中的输出缓存

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:15 24 4
gpt4 key购买 nike

有谁知道是否可以在代码中取消输出缓存?我的意思是,如果我将输出缓存放在子操作上,如下所示,我可以根据条件从子操作内部取消缓存吗?

[ChildActionOnly]
[OutputCache(Duration = 36000, VaryByParam="tagslug")]
public virtual ActionResult MostViewed(string tagslug, int count)
{
// Make an API call here. If not data returned do not cache the ChildAction as specified above
}

最佳答案

略读 the framework source看起来唯一的逻辑是不缓存异常:

// Only cache output if this wasn't an error
if (!wasException) {
ChildActionCacheInternal.Add(uniqueId, capturedText,
DateTimeOffset.UtcNow.AddSeconds(Duration));
}

我看不出解决这个问题的绝妙方法:我认为您必须根据来自 CodePlex 的 ASP.NET MVC 源的原始源制作自己的自定义 OutputCachingAttribute,并且然后在该行中为返回的输出添加一个额外的检查,例如

if (!(wasException || capturedText.Contains("results:0"))) {

或类似的,或者找到一种方法将该代码从您的 Controller 传递给它。现有代码使用一个对象来存储 session 上的值;你可以复制这个,例如

  1. 定义一个新的静态对象键,与 _childActionFilterFinishCallbackKey 相同,例如_noCacheResultKey
  2. 将公共(public)静态方法添加到您可以调用的属性,例如

    public static void FlagNoCache(HttpContext httpContext) {
    httpContext.Items[_noCacheResultKey] = true;
    }
  3. 扩展 ClearChildActionFilterFinishCallback 以从 .Items[] 以及回调中删除它
  4. 扩展上述测试以检查这一点,例如

    if (!(wasException
    || filterContext.HttpContext.Items.ContainsKey(_noCacheResultKey))) {
  5. 根据需要从您的 Controller 调用 MyOutputCacheAttribute.FlagNoCache(Context);

也可以从您的代码中抛出异常,然后在不同的 IExceptionFilter 中捕获它,这样它就不会超出 OutputCacheAttribute 传递,但是我不知道有多抱歉。

关于c# - 取消 ChildAction 中的输出缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com