系列文章

前言

放完端午假期回来,我的博客还没上线,看着各位大佬的网站都办得风生水起,我隐约感觉到一丝紧迫感,得抓紧时间写代码了~!

前面的文章已经把博客网站的基本功能实现起来了,距离网站上线只有一步之遥,然而还有一些细枝末节之处,对网站的运营或者用户体验有很大影响,必须完善的,比如:

  • 网站访问统计
  • 图床

按照先后顺序,本文先解决访问统计的问题。

一提到访问统计,众所周知的就是Google Analytics或者百度统计,前者在国内无法使用,后者应该是唯一选择了,但考虑到两者的功能差距以及该公司的口碑,对我这个小破站来说,我宁愿自己实现一个~

实现

实现起来应该是不难的,为了实现统计、分析,我们需要先记录,记录的内容包括用户的IP、设备、访问路径、访问时间,然后再对这些数据进行分析,就可以得出每篇文章、图片、分类的阅读量/访问量。

为了记录这些数据,需要在用户发起每一个请求时都进行处理,在AspNetCore中有多种实现,比如Filter、比如Middleware

这里我选的是中间件的方式

PS:我看到网上有一篇文章介绍Django实现访问统计的,那个作者写了一个方法,在每个接口里调用一次,看得我头皮发麻

在中间件中注入Repo,然后每次请求都把IP、设备、请求路径等数据保存在数据库中。这样看起来应该是会有一些影响性能的,不过考虑到博客网站的并发应该很小,带来的性能损失应该可以忽略不计。(说白了就是懒)

后续有性能瓶颈时再来优化吧~

模型定义

StarBlog.Data/Models中新建一个VisitRecord.cs

为了节省篇幅,注释啥的就不放了,具体代码可见github

public class VisitRecord {
public int Id { get; set; }
public string Ip { get; set; }
public string RequestPath { get; set; }
public string? RequestQueryString { get; set; }
public string RequestMethod { get; set; }
public string UserAgent { get; set; }
public DateTime Time { get; set; }
}

写个中间件

StarBlog.Web/Middlewares中新建一个VisitRecordMiddleware.cs

public class VisitRecordMiddleware {
private readonly RequestDelegate _next; public VisitRecordMiddleware(RequestDelegate requestDelegate) {
_next = requestDelegate;
} public Task Invoke(HttpContext context, IBaseRepository<VisitRecord> visitRecordRepo) {
var request = context.Request;
var response = context.Response; visitRecordRepo.InsertAsync(new VisitRecord {
Ip = "",
RequestPath = request.Path,
RequestQueryString = request.QueryString.Value,
RequestMethod = request.Method,
UserAgent = request.Headers.UserAgent,
Time = DateTime.Now
}); return _next(context);
}
}

这里有个地方要注

意的,我的visitRecordRepo是在Invoke方法中注入的,为什么不在构造方法中注入呢?

因为AspNetCore中间件的构造方法是Singleton的,所以只能注入Singleton方式的服务,而FreeSQL的Repository是Scoped的,如果在构造方法中注入就会报错

所以只能在Invoke方法中注入~

使用中间件

编辑StarBlog.Web/Programs.cs,增加中间件配置

app.UseMiddleware<VisitRecordMiddleware>();

PS:本项目基于.Net6,Startup和Program合二为一了;如果是.NetCore3.1及以下版本,则是在Startup.cs中配置中间件。

效果

目前还没有根据访问记录做分析,所以只能截个数据库的图片

OK,接下来可以根据这些数据来做分析了(后面管理后台开发的部分再来写)

基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计的更多相关文章

  1. 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  2. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. 基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  4. 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  7. 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传

    前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...

  8. 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

    前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...

  9. 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

随机推荐

  1. 一个chome的广告拦截小插件

    先附上下载地址:https://chromecj.com/productivity/2015-03/391.html 可以屏蔽绝大多数广告啊,浏览器用起来神清气爽! 下载完成后有一个名字为这个的文件, ...

  2. CCF201909-1小明种苹果

    解题思路:定义一个二维数组来存放输入的信息,第一列用来存放所有果树的初始值,然后遍历数组.具体思路见代码注释. 第一遍提交得了80分,看了半天才明白了原因,快被自己蠢死...... 定义数组应该为a[ ...

  3. Mybatis的简介+简单实现增删改查案例

    @ 目录 总结内容 1. 基本概念 2. Mybatis的使用 需求 配置文件简介 总结 总结内容 1. 基本概念 Mybatis是一款优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射.My ...

  4. Python使用递归绘制谢尔宾斯基三角形

    谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作. 运行效果: 源代码: 1 impor ...

  5. 【零碎小bug系列】安卓开发是遇到空指针异常java.lang.NullPointerException: Attempt to invoke...

    安卓开发是遇到空指针异常 java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable ...

  6. 微信小程序 因文件大小不能使用本地背景图片解决方法

    因微信文件只允许2m,所以不能给图片太多空间.所以出现背景图片的坑 解决方案1: 把背景图片放到服务器文件件下,直接将路径给url. 得是https开头的路径才可以 解决方案2:将图片转换成base6 ...

  7. Codeforces Round #771 (Div. 2), problem: (B) Odd Swap Sort

    Problem - B - Codeforces 就是给你个序列, 给他整成升序的, 每次操作可以使相邻两个数交换位置, 交换条件是二数之和为奇数 结果只需输出是否可以整成升序的 思路: 需要奇数偶数 ...

  8. JavaScript学习基础2

    ##JavaScript基本对象 1 .function:函数(方法)对象 * 创建: 1.var fun =new Function(形式参数,方法体): 2.function 方法名(参数){ 方 ...

  9. Android Studio 的蓝牙串口通信(附Demo源码下载)

    根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...

  10. arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上

    前言 之前看了官方玩过一个智能猫眼摄像头,我很有兴趣,但是那个 IDF 平台属实难整,我光安装都整了一天,网不好下载的包可能有问题.然后命令行操作也比较麻烦,我就想到了无敌的 arduino ,ESP ...