Asp.net MVC + Redis(hash入庫+log4net集成)

来源:https://www.cnblogs.com/hoyu/archive/2018/05/20/9063675.html
-Advertisement-
Play Games

博客四元素 既然要寫一個博客類的網站,那就應該知道博客的相關信息。 標題|作者|時間|內容 | | | title|author|time|content 因為之前有瞭解過Redis,所以有點糾結於數據的存儲方式,最終決定還是按照書上寫的一步一步來,搞完了之後再決定是不是需要做修改。 書中介紹的存儲 ...


博客四元素

既然要寫一個博客類的網站,那就應該知道博客的相關信息。

標題 作者 時間 內容
title author time content

因為之前有瞭解過Redis,所以有點糾結於數據的存儲方式,最終決定還是按照書上寫的一步一步來,搞完了之後再決定是不是需要做修改。

書中介紹的存儲方式如下:

post:count title 小猿的博客
author 小猿
time 2018.5.17
content 世界如此美妙,我卻選擇的程式員

看的出來博客的所有內容都是以HashSet形式存儲的(目前狀態),保證存儲內容的唯一性取決於post:count的count,這個count應該類似於自增變數。

  1. 既然是面向對象編程,第一件事肯定是創建一個實體類;

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Blog.Common;
    
    namespace Blog.Models
    {
    public class BLogModel
    {
        public BLogModel(string title, string author, DateTime time, string content)
        {
            bool flag = true;
            if (!title.IsNullOrEmpty())
                this.title = title;
            else
                flag = false;
    
            if (!author.IsNullOrEmpty())
                this.author = author;
            else
                flag = false;
    
            if (time == null)
                flag = false;
            else
                this.time = time;
    
            if (!content.IsNullOrEmpty())
                this.content = content;
            else
                flag = false;
    
                if(flag==false)
                {
                    throw new ApplicationException("創建BLogModel實體有必填欄位為空");
                }
        }
        public string title { get; set; }
    
        public string author { get; set; }
    
        public DateTime time { get; set; }
    
        public string content { get; set; }
    }
    }

    創建這個實體類,我住了定義欄位之外主要做了兩件事。

    ①由於在我的SDK里沒有找到判空的方法,所以給string寫一個擴展方法IsNullOrEmpty

    ②每一個博客對象都應該是完整的即每個欄位都是必填項,因為使用的是Redis存儲也就只能在C#中判斷必填項了;

    這裡還說到另外一個問題,通常情況下需要建立文章縮略名稱和文章ID的關聯關係。這樣做的目的是為了確保文章的唯一性和符合網站網址規範上的一些操作。但是現在還不打算啟用這一操作。

  2. 糾結的入庫方式

    本來我想的是在控制器中獲得數據然後調用RedisCommon的方法獲取一個連接對象添加一下就行了,但是代碼寫了很長一行才搞定exist的判斷,有點忍不了。還是決定把所有數據都扔給RedisCommon類叫他來完成這件事情。

    首先一打開這個類我就決定先寫一個擴展方法(我可能最近比較迷戀寫擴展),和之前的ToDic正好相反,這次是把Dictionary

     public static HashEntry[] ToHashEntry(this Dictionary<string, string> dic)
        {
            List<HashEntry> list = new List<HashEntry>();
            foreach (var item in dic.Keys)
            {
                list.Add(new HashEntry(item, dic[item]));
            }
    
            return list.ToArray();
        }

    寫這個方法的目的是感覺以後會有很多的字典轉成HashEntry數組的情況,使用起來可能比較方便,然後就可以開心的寫入庫方法了。

     public static void SetBLog(BLogModel bLog)
        {
            string postCount = GetData().StringIncrement("post:count").ToString();
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("title", bLog.title);
            dic.Add("author", bLog.author);
            dic.Add("time", bLog.time.ToString());
            dic.Add("content", bLog.content);
    
            try
            {
                GetData().HashSet("post:"+postCount, dic.ToHashEntry());
            }
            catch (Exception e)
            {
                throw e;
            }
        }

    雖然還不想使用縮略名稱和ID關聯關係的這個功能,但還是寫上吧,省的以後費事。

     public static bool SetSlugToId(string slug, string id)
        {
            if (!GetData().HashExists("slug.to.id", slug))
            {
                GetData().HashSet("slug.to.id", slug, id);
                return true;
            }
            return false;
        }
  3. 集成log4net

    log4net就很熟悉了,雖然可以把各種日誌都打到資料庫中,但是感覺最實用的還是日誌文件。

    所以起手式還是dotnet cli命令dotnet add package log4net

    這裡提一下,準備以後有時間瞭解一下bower,如果可以搞定的話,就玩一下。

    然後操作步驟如下文

    • 創建一個文件,起名叫log4net.config。
    • 在項目起始方法中載入log4net。
    • 創建一個全局異常類,其實可以不用這個類的,但是感覺還不錯就加進來了。

    log4net.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <!-- This section contains the log4net configuration settings -->
    <log4net>
    
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logfile/" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <staticLogFileName value="false" />
      <datePattern value="yyyyMMdd'.log'" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    
    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
    
    </log4net>
    </configuration>

    在Startup文件中載入log4net,其實比原來就多加了三行代碼。

    這裡需要說的就是創建靜態ILoggerRepository的時候需要導包,最機智的方法自然就是dotnet new sln創建一個解決方案,把項目填進去,用VS解決這件事。

      public static ILoggerRepository repository{get;set;}
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
    
            //載入log4net日誌配置文件
            repository = LogManager.CreateRepository("NETCoreRepository");
            XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
        }

    全局異常類

    using log4net;
    using Microsoft.AspNetCore.Mvc.Filters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace Blog
    {
    public class HttpGlobalExceptionFilter : IExceptionFilter
    {
        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
        public void OnException(ExceptionContext context)
        {
            log.Error(context.Exception);
        }
    }
    }
    

    log的使用方式,一般情況下吧log對象放在基類中就夠用了。

     protected static ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
    
     log.Info("log test fisish");

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分析:既然是訂單號/交易流水號,首先是不能重覆,其次需考慮到性能問題。 設計如下: "HF"+時間戳+隨機數+迴圈數 代碼如下: 其中:RandomUtils類 1 package com.test.common.util; 2 3 import org.apache.commons.lang.Ra ...
  • 演示站:c.lmz8.cn打開js/4.js,複製到工具箱的js代碼整理那,先解密,方便查看。工具箱:tool.lmz8.cnjs代碼整理、線上解碼 這個便是文字,只不過唄轉碼了,所以要用到解碼工具。內容更改:index.html(裡面的網址改了,否則會跳轉到我的網站)js/4.js(網址、照片、音 ...
  • 爬蟲基本流程 發起請求 通過HTTP庫向目標伺服器發送Request,Request內可以包含額外的headers信息。 獲取響應內容 如果伺服器正常響應,會返回Response, 裡面包含的就是該頁面的內容。 解析數據 內容或許是HTML,可以用正則表達式、網頁解析庫進行解析。 或許是Json,可 ...
  • http協議 協議:是一種規則或者規定 tcp/ip協議:規則了tcp客戶端與tcp伺服器數據的通訊格式 1.知識點是什麼:http協議 2.知識點有什麼:規定瀏覽器與伺服器(tcp伺服器)之間的數據通訊格式 3.請求的協議格式<客戶端(瀏覽器)發數據給伺服器> GET /index.html HT ...
  • 使用.net core也有一段時間了,一直都沒有Oracle官方的正式版驅動程式,更別說EF版本了。之前基於Oracle官方的.net core預覽版本寫了個Dapper的資料庫操作實現,但是總感覺不太完美,有消息稱Oracle官方的EF版本可能要到第三季度出了,還需要靜靜等待幾個月的時間。 既然有 ...
  • 5章 字元與字元串 1.字元類char的使用 2.轉義字元的使用 3.字元串類string的使用 4.比較字元串 5.格式化字元串 6.截圖,分割字元串 7.插入與填充字元串 8.刪除,複製,替換字元串 9.StringBuilder的使用 6章 流程式控制制語句 1.選擇語句 2.迭代語句 3.跳轉語 ...
  • 在做後臺管理系統的同學們,是否有用easyui的經歷。雖然現在都是vue、ng、react的時代。但easyui(也就是jquery為基礎)還是占有一席之地的。因為他對後端開發者太友好了,太熟悉不過了。要讓一個後端開發者來理解vue或者是react的VNode、狀態器、組件等,都是有那麼一點點的為難 ...
  • .NET Orm 性能測試 簡介 "OrmBenchmark" 這個項目主要是為了測試主要的Orm對於 SqlServer 資料庫的查詢並將數據轉換成所需 POCO 對象的耗時情況(好吧,實際上不完全orm,更像是SqlMapper ...) 測試結果: .NetFramework 4.6 有預熱 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...