我有这样的行动:
[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来解决这个问题。与此同时,这个问题也被证明也消失了,现在这个计数器是有效的。
答案 0 :(得分:0)
该方法的输出被缓存,并从缓存的位置分发。这可能甚至不是最初生成/提供内容的服务器。如果满足缓存键的要求,服务器将永远不会知道请求,因为整个内容将从缓存发送,因此无法以这种方式递增计数器。
我能想到的一种解决方法是在内容的输出中调用脚本,该脚本调用对具有该ID的其他端点执行请求。然后,另一个端点可以为您递增计数器。