自定义属性不适用于outputcache属性

时间:2016-01-21 11:39:06

标签: c# asp.net-mvc caching attributes

我有这样的行动:

[Route("~/blog-{id}")]
[Count("Blog","id")]
[OutputCache(Duration = 3600, VaryByParam = "id", Location = OutputCacheLocation.ServerAndClient)]
public virtual async Task<ActionResult> Details(int id)

我还有一个简单的课程如下:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)]
public class CountAttribute :FilterAttribute,IActionFilter
{
    private readonly string _id;
    private readonly string _name;

    public CountAttribute( string name, string id)
    {
        _id = id;
        _name = name;
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var value = filterContext.Controller.ValueProvider.GetValue(_id).AttemptedValue;
        if (value == null)
        {
            return;
        }


        string path =
            filterContext.HttpContext.Request.MapPath(string.Format("~/App_Data/{0}_{1}.txt", _name, value));


        if (!File.Exists(path))
        {
            File.WriteAllText(path, "1");
        }
        else
        {
            var readText = File.ReadAllText(path);

            var viewsInt = Int32.Parse(readText);
            viewsInt++;
            File.WriteAllText(path, viewsInt.ToString());

        }

    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //
    }
}

这是一个简单的计数器类,用于我的操作的商店页面浏览量。 我在OnActionExecuting方法上使用了一个断点来查看它是否正常工作。它确实很有效但只有当我从我的行为中删除OutPutCache属性时才会这样做。如果我不这样做,它只会打一次,而当页面不在缓存中时。

那么我如何使用OutPutCache并使这个类有效呢?

更新

我的布局页面中有一个_LoginPartial来显示我的用户信息。但是使用OutPutCache使其正常工作是不可行的。 所以我使用了DonotPutCache来解决这个问题。与此同时,这个问题也被证明也消失了,现在这个计数器是有效的。

1 个答案:

答案 0 :(得分:0)

该方法的输出被缓存,并从缓存的位置分发。这可能甚至不是最初生成/提供内容的服务器。如果满足缓存键的要求,服务器将永远不会知道请求,因为整个内容将从缓存发送,因此无法以这种方式递增计数器。

我能想到的一种解决方法是在内容的输出中调用脚本,该脚本调用对具有该ID的其他端点执行请求。然后,另一个端点可以为您递增计数器。