天天看點

基于.NetCore開發部落格項目 StarBlog - (11) 實作通路統計

系列文章

  • 基于.NetCore開發部落格項目 StarBlog - (1) 為什麼需要自己寫一個部落格?
  • 基于.NetCore開發部落格項目 StarBlog - (2) 環境準備和建立項目
  • 基于.NetCore開發部落格項目 StarBlog - (3) 模型設計
  • 基于.NetCore開發部落格項目 StarBlog - (4) markdown部落格批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (5) 開始搭建Web項目
  • 基于.NetCore開發部落格項目 StarBlog - (6) 頁面開發之部落格文章清單
  • 基于.NetCore開發部落格項目 StarBlog - (7) 頁面開發之文章詳情頁面
  • 基于.NetCore開發部落格項目 StarBlog - (8) 分類層級結構展示
  • 基于.NetCore開發部落格項目 StarBlog - (9) 圖檔批量導入
  • 基于.NetCore開發部落格項目 StarBlog - (10) 圖檔瀑布流
  • 基于.NetCore開發部落格項目 StarBlog - (11) 實作通路統計
  • 基于.NetCore開發部落格項目 StarBlog - (12) Razor頁面動态編譯
  • 基于.NetCore開發部落格項目 StarBlog - (13) 加入友情連結功能
  • 基于.NetCore開發部落格項目 StarBlog - (14) 實作主題切換功能
  • 基于.NetCore開發部落格項目 StarBlog - (15) 生成随機尺寸圖檔
  • 基于.NetCore開發部落格項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)
  • 基于.NetCore開發部落格項目 StarBlog - (17) 自動下載下傳文章裡的外部圖檔
  • ...

前言

放完端午假期回來,我的部落格還沒上線,看着各位大佬的網站都辦得風生水起,我隐約感覺到一絲緊迫感,得抓緊時間寫代碼了~!

前面的文章已經把部落格網站的基本功能實作起來了,距離網站上線隻有一步之遙,然而還有一些細枝末節之處,對網站的營運或者使用者體驗有很大影響,必須完善的,比如:

  • 網站通路統計
  • 圖床

按照先後順序,本文先解決通路統計的問題。

一提到通路統計,衆所周知的就是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 = context.Connection.RemoteIpAddress?.ToString().Split(":").Last(),
            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中配置中間件。

效果

目前還沒有根據通路記錄做分析,是以隻能截個資料庫的圖檔

基于.NetCore開發部落格項目 StarBlog - (11) 實作通路統計

OK,接下來可以根據這些資料來做分析了(後面管理背景開發的部分再來寫)

微信公衆号:「程式設計實驗室」

專注于網際網路熱門新技術探索與團隊靈活開發實踐,包括架構設計、機器學習與資料分析算法、移動端開發、Linux、Web前後端開發等,歡迎一起探讨技術,分享學習實踐經驗。

繼續閱讀