几天前,我创建了我的小项目。这个项目是我个人的博客。他基于ASP.NET WebAPI(后端),Angular(前端)。
我的Post
实体有ViewCount
字段。
如何计算帖子浏览量?在重启(F5)时,计数器不会增加。
是否有现成的代码或实施提示?
感谢所有回复的人。
答案 0 :(得分:0)
您需要自己创建一些内容,因为您的问题过于宽泛,但一般来说,每次受到影响时,您都需要在操作中更新Post
实体。例如:
post.ViewCount++;
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
但是,有许多事情需要考虑:
您需要规划并发问题(即,同时尝试更新视图计数的多个同时请求)。为此,您需要在保存时捕获并回复DbUpdateConcurrencyException
。
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
// handle it
}
如何处理并发有各种策略。 Microsoft details your options。但是,简单地处理一次,可能是不够的,因为下一次保存也可能导致并发异常,等等。我建议使用像Polly之类的东西,它可以为你提供更强大的异常处理能力,包括多次重试或永久重试。
您需要清除重复的请求(例如,从F5刷新)。要做到这一点,你可能想要在用户的会话中设置一些内容,例如访问时间,然后只计算视图,如果它是自用户上次访问页面以来确定的时间量,或者密钥没有t存在于他们的会话中(第一个视图)。尽管如此,请记住会话超时。例如,如果您只想每小时为一个用户计算一个视图,但是您的会话在20分钟后超时,则无法正常工作。在这种情况下,您希望将访问时间存储在更持久的位置,如数据库表。如果您确实使用了会话,那么您还应该使用SQL Server或Redis支持来处理会话状态,而不是使用In Proc或State Server,因为前者比后者更可靠。
您需要考虑机器人。这可以是页面的任何自动查看,良性或恶意。至少,您需要考虑像GoogleBot这样的蜘蛛,因此每次网站编入索引时都不会增加查看次数。但是,尝试确定请求是否源自机器人本身就是一件事。明确管理机器人UA字符串的整个数据库,以尝试跟踪野外的内容。至少可以排除绝大多数自动流量,但您的观看次数基本上与过滤机器人一样准确。
基于这一切,除非你有一个真的好的理由,你实际上需要自己跟踪视图数量,我会说不用担心。例如,如果您只是尝试在内部报告使用情况统计信息,那么采用类似Google Analytics的方法,将是一个更容易,更易于管理的解决方案。即使您确实需要应用程序中某些内容的视图计数,在本地安装第三方分析软件仍然可能更好。寻找带有API的解决方案或者至少以某种方式以编程方式获取数据,然后您可以简单地从中提取视图数。