上一講建立了日誌資料表與模型,本篇將日誌機制落地到實際業務流程中。重點包括:建立通用工具類 ResultHelper(GUID 生成、字串處理、SQL 防注入)、封裝日誌寫入器 LogHandler 避免重複實例化、以及在 Controller 的 Create/Edit/Delete Action 中整合日誌記錄與例外處理。
位於 App.Common 專案,提供專案級共用功能:
using System;
using System.Web;
using System.Text.RegularExpressions;
namespace App.Common {
public static class ResultHelper {
#region 唯一識別碼生成
/// 時間戳 + GUID 前 10 碼,生成 32 位唯一 ID
public static string NewId {
get {
string timePart = DateTime.Now.ToString("yyyyMMddHHmmssfffffff");
string guidPart = Guid.NewGuid().ToString("N").Substring(0, 10);
return timePart + guidPart;
}
}
/// 純時間戳 ID(高併發下可能重複,僅適用低併發場景)
public static string NewTimeId {
get { return DateTime.Now.ToString("yyyyMMddHHmmssfffffff"); }
}
#endregion
#region 字串處理與安全過濾
/// 截取字串並附加省略號,同時移除 HTML 標籤
public static string SubValue(string value, int length) {
if (string.IsNullOrEmpty(value)) return string.Empty;
if (value.Length > length) {
value = value.Substring(0, length) + "...";
}
return NoHtml(value);
}
/// 輸入端過濾:HTML 編碼、單引號轉義、換行轉 <br>
public static string InputText(string inputString) {
if (string.IsNullOrEmpty(inputString)) return string.Empty;
inputString = inputString.Trim();
inputString = inputString.Replace("
", "\n");
inputString = inputString.Replace("&", "&");
inputString = inputString.Replace("'", "''");
inputString = inputString.Replace("<", "<");
inputString = inputString.Replace(">", ">");
inputString = inputString.Replace("chr(60)", "<");
inputString = inputString.Replace("chr(37)", ">");
inputString = inputString.Replace("\"", """);
inputString = inputString.Replace(";", ";");
return inputString;
}
/// 輸出端還原:HTML 解碼、單引號還原、<br> 還原換行
public static string OutputText(string outputString) {
if (string.IsNullOrEmpty(outputString)) return string.Empty;
outputString = outputString.Trim();
outputString = outputString.Replace("&", "&");
outputString = outputString.Replace("''", "'");
outputString = outputString.Replace("<", "<");
outputString = outputString.Replace(">", ">");
outputString = outputString.Replace("<", "chr(60)");
outputString = outputString.Replace(">", "chr(37)");
outputString = outputString.Replace(""", "\"");
outputString = outputString.Replace(";", ";");
outputString = outputString.Replace("\n", "
");
return outputString;
}
/// 移除 HTML 標籤與腳本,防止 XSS
public static string NoHtml(string htmlString) {
if (string.IsNullOrEmpty(htmlString)) return string.Empty;
// 移除腳本
htmlString = Regex.Replace(htmlString, @"", "", RegexOptions.IgnoreCase);
// 移除 HTML 標籤
htmlString = Regex.Replace(htmlString, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);
// 移除多餘空白行
htmlString = Regex.Replace(htmlString, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);
// 移除註釋
htmlString = Regex.Replace(htmlString, @"-->", "", RegexOptions.IgnoreCase);
htmlString = Regex.Replace(htmlString, @"