<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      基于.NetCore開發(fā)博客項目 StarBlog - (11) 實現(xiàn)訪問統(tǒng)計

      系列文章

      前言

      放完端午假期回來,我的博客還沒上線,看著各位大佬的網(wǎng)站都辦得風生水起,我隱約感覺到一絲緊迫感,得抓緊時間寫代碼了~!

      前面的文章已經(jīng)把博客網(wǎng)站的基本功能實現(xiàn)起來了,距離網(wǎng)站上線只有一步之遙,然而還有一些細枝末節(jié)之處,對網(wǎng)站的運營或者用戶體驗有很大影響,必須完善的,比如:

      • 網(wǎng)站訪問統(tǒng)計
      • 圖床

      按照先后順序,本文先解決訪問統(tǒng)計的問題。

      一提到訪問統(tǒng)計,眾所周知的就是Google Analytics或者百度統(tǒng)計,前者在國內(nèi)無法使用,后者應該是唯一選擇了,但考慮到兩者的功能差距以及該公司的口碑,對我這個小破站來說,我寧愿自己實現(xiàn)一個~

      實現(xiàn)

      實現(xiàn)起來應該是不難的,為了實現(xiàn)統(tǒng)計、分析,我們需要先記錄,記錄的內(nèi)容包括用戶的IP、設(shè)備、訪問路徑、訪問時間,然后再對這些數(shù)據(jù)進行分析,就可以得出每篇文章、圖片、分類的閱讀量/訪問量。

      為了記錄這些數(shù)據(jù),需要在用戶發(fā)起每一個請求時都進行處理,在AspNetCore中有多種實現(xiàn),比如Filter、比如Middleware

      這里我選的是中間件的方式

      PS:我看到網(wǎng)上有一篇文章介紹Django實現(xiàn)訪問統(tǒng)計的,那個作者寫了一個方法,在每個接口里調(diào)用一次,看得我頭皮發(fā)麻

      在中間件中注入Repo,然后每次請求都把IP、設(shè)備、請求路徑等數(shù)據(jù)保存在數(shù)據(jù)庫中。這樣看起來應該是會有一些影響性能的,不過考慮到博客網(wǎng)站的并發(fā)應該很小,帶來的性能損失應該可以忽略不計。(說白了就是懶)

      后續(xù)有性能瓶頸時再來優(yōu)化吧~

      模型定義

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

      為了節(jié)省篇幅,注釋啥的就不放了,具體代碼可見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方法中注入的,為什么不在構(gòu)造方法中注入呢?

      因為AspNetCore中間件的構(gòu)造方法是Singleton的,所以只能注入Singleton方式的服務(wù),而FreeSQL的Repository是Scoped的,如果在構(gòu)造方法中注入就會報錯

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

      使用中間件

      編輯StarBlog.Web/Programs.cs,增加中間件配置

      app.UseMiddleware<VisitRecordMiddleware>();
      

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

      效果

      目前還沒有根據(jù)訪問記錄做分析,所以只能截個數(shù)據(jù)庫的圖片

      數(shù)據(jù)庫

      OK,接下來可以根據(jù)這些數(shù)據(jù)來做分析了(后面管理后臺開發(fā)的部分再來寫)

      posted @ 2022-06-06 17:53  程序設(shè)計實驗室  閱讀(1590)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 国产AV永久无码青青草原| 亚洲国产精品色一区二区| 97亚洲熟妇自偷自拍另类图片| 男人扒开女人内裤强吻桶进去| 麻豆国产成人AV在线播放| 国产成人av乱码在线观看| 国产精品推荐视频一区二区| 人人妻人人狠人人爽天天综合网| 亚洲人午夜精品射精日韩| 天天做天天爱夜夜爽导航| 亚洲卡1卡2卡新区网站| 亚洲av激情一区二区三区| 国产亚洲精品自在久久vr| 尹人香蕉久久99天天拍| 99精品国产高清一区二区麻豆 | 99精品国产兔费观看久久99 | 国产精品中文字幕观看| 嫖妓丰满肥熟妇在线精品| 99RE6在线观看国产精品| 国产激情精品一区二区三区| 亚洲国产精品日韩AV专区| 国产精品午夜福利导航导| 成人国产片视频在线观看| 成人免费无遮挡在线播放| 最新av中文字幕无码专区| 欧美色欧美亚洲高清在线观看| 国产伦视频一区二区三区| 91精品国产吴梦梦在线观看永久 | 亚洲区中文字幕日韩精品| 丁香五月亚洲综合在线国内自拍| 白沙| 婷婷四房综合激情五月在线| 中文字幕日韩有码一区| 樱桃视频影院在线播放| 國产AV天堂| 18禁无遮拦无码国产在线播放| 最新国产精品好看的精品| 国产区精品福利在线熟女| 无码国内精品人妻少妇| 国产乱码日产乱码精品精| 灵寿县|