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

C# 博客文章的查看计数。ASP.NET WebAPI 2,c#,asp.net,asp.net-mvc-4,asp.net-web-api,C#,Asp.net,Asp.net Mvc 4,Asp.net Web Api,几天前,我创建了我的小项目。这个项目是我的个人博客。他基于ASP.NETWebAPI(后端),Angular(前端) 我的Post实体有ViewCount字段 如何计算post视图的数量?重启时(F5),计数器不会增加 是否有现成的代码或实现技巧 感谢所有回复的人。由于您的问题过于宽泛,您需要自己创建一些内容,但一般来说,您需要在每次操作中更新您的Post实体。例如: post.ViewCount++; db.Entry(post).State = EntityState.Modified; d

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

我的
Post
实体有
ViewCount
字段

如何计算post视图的数量?重启时(F5),计数器不会增加

是否有现成的代码或实现技巧


感谢所有回复的人。

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

post.ViewCount++;
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
然而,有许多事情需要考虑:

  • 您需要计划并发问题(即,多个同时请求试图同时更新视图计数)。为此,保存时需要捕获并响应
    DbUpdateConcurrencyException

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
        // handle it
    }
    
    对于如何处理并发性,有多种策略。但是,仅仅处理一次可能还不够,因为下一次保存还可能导致并发异常,等等。我建议您使用类似的方法,这将为您提供更强大的异常处理能力,包括多次重试或永远重试

  • 您需要删除重复的请求(例如,从F5刷新中)。要做到这一点,您可能需要在用户会话中设置一些内容,例如访问时间,然后仅在用户上次访问页面后确定了一定的时间,或者密钥在会话中不存在(第一个视图)时才计算视图。不过,请记住会话超时。例如,如果您只想每小时统计一个用户的视图,但会话在20分钟后超时,那么这是行不通的。在这种情况下,您可能希望将访问时间存储在更持久的位置,如数据库表。如果您确实使用了会话,那么还应该为会话状态使用SQL Server或Redis备份,而不是在Proc或state Server中,因为前者比后者更可靠

  • 你需要考虑机器人。这可能是对页面的任何自动查看,无论是良性的还是恶意的。至少,您需要考虑像GoogleBot这样的爬行器,这样您就不会在每次站点被索引时都增加视图计数。然而,试图确定请求是否来自bot本身就是一件大事。整个bot-UA字符串数据库都被显式管理,以尝试跟踪野外的情况。至少排除绝大多数自动流量是可以实现的,但您的视图计数基本上与过滤机器人一样准确


  • 基于所有这些,除非你有一个很好的理由,你真的需要跟踪自己的看法计数,我会说,不要担心它。例如,如果您只是尝试在内部报告使用情况统计数据,那么使用谷歌分析等工具将是一个更容易、更易于管理的解决方案。即使您确实需要应用程序中某些内容的视图计数,也最好在本地安装第三方分析软件。寻找一个具有API的解决方案,或者至少以某种方式以编程方式获取数据,然后您可以简单地从中提取视图计数。

    不要为代码吸血鬼哦,对不起,因为考虑这项任务超过2天。也许你知道怎么做这个任务?