查看博客文章的计数。 ASP.NET WebAPI 2

时间:2017-05-01 15:40:22

标签: c# asp.net asp.net-mvc-4 asp.net-web-api

几天前,我创建了我的小项目。这个项目是我个人的博客。他基于ASP.NET WebAPI(后端),Angular(前端)。

我的Post实体有ViewCount字段。

如何计算帖子浏览量?在重启(F5)时,计数器不会增加。

是否有现成的代码或实施提示?

感谢所有回复的人。

1 个答案:

答案 0 :(得分:0)

您需要自己创建一些内容,因为您的问题过于宽泛,但一般来说,每次受到影响时,您都需要在操作中更新Post实体。例如:

post.ViewCount++;
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();

但是,有许多事情需要考虑:

  1. 您需要规划并发问题(即,同时尝试更新视图计数的多个同时请求)。为此,您需要在保存时捕获并回复DbUpdateConcurrencyException

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
        // handle it
    }
    

    如何处理并发有各种策略。 Microsoft details your options。但是,简单地处理一次,可能是不够的,因为下一次保存也可能导致并发异常,等等。我建议使用像Polly之类的东西,它可以为你提供更强大的异常处理能力,包括多次重试或永久重试。

  2. 您需要清除重复的请求(例如,从F5刷新)。要做到这一点,你可能想要在用户的会话中设置一些内容,例如访问时间,然后只计算视图,如果它是自用户上次访问页面以来确定的时间量,或者密钥没有t存在于他们的会话中(第一个视图)。尽管如此,请记住会话超时。例如,如果您只想每小时为一个用户计算一个视图,但是您的会话在20分钟后超时,则无法正常工作。在这种情况下,您希望将访问时间存储在更持久的位置,如数据库表。如果您确实使用了会话,那么您还应该使用SQL Server或Redis支持来处理会话状态,而不是使用In Proc或State Server,因为前者比后者更可靠。

  3. 您需要考虑机器人。这可以是页面的任何自动查看,良性或恶意。至少,您需要考虑像GoogleBot这样的蜘蛛,因此每次网站编入索引时都不会增加查看次数。但是,尝试确定请求是否源自机器人本身就是一件事。明确管理机器人UA字符串的整个数据库,以尝试跟踪野外的内容。至少可以排除绝大多数自动流量,但您的观看次数基本上与过滤机器人一样准确。

  4. 基于这一切,除非你有一个真的好的理由,你实际上需要自己跟踪视图数量,我会说不用担心。例如,如果您只是尝试在内部报告使用情况统计信息,那么采用类似Google Analytics的方法,将是一个更容易,更易于管理的解决方案。即使您确实需要应用程序中某些内容的视图计数,在本地安装第三方分析软件仍然可能更好。寻找带有API的解决方案或者至少以某种方式以编程方式获取数据,然后您可以简单地从中提取视图数。