System.Text.Json 與 Newtonsoft.Json 的深入比較
上一篇文章提到從 Newtonsoft.Json 遷移到 System.Text.Json 的實際經驗,這篇專注在兩者的功能與行為差異,讓你在選型時有具體依據。 歷史背景Newtonsoft.Json(又稱 Json.NET)由 James Newton-King 於 2006 年首次發布,長期是 .NET 生態系的預設 JSON 工具。ASP.NET Core 2.x 的 MVC 框架預設使用它進行模型序列化,直到 ASP.NET Core 3.0 才改為 System.Text.Json。 System.Text.Json 隨 .NET Core 3.0(2019 年)一起推出,由微軟直接整合進執行時期,設計目標是效能與低配置開銷——代價是功能集比 Newtonsoft.Json 精簡。 效能根據 BenchmarkDotNet 的公開測試,System.Text.Json 的序列化吞吐量約比 Newtonsoft.Json 快 20–35%。記憶體配置差距因資料形狀差異很大:小物件可能只差一點,大批次 JSON 串流場景下 System.Text.Json 因避免中間字串配...
防駭客必學!一次搞懂 IIS HSTS 設定,告別 HTTPS 降級攻擊
你的網站已經設定 HTTPS 了嗎?光設定 HTTPS 還不夠——本文拆解 HSTS 的運作原理,並示範在 IIS 上的兩種設定方式。 問題發現:弱點掃描警告最近在進行專案的弱點掃描時,發現了一個低風險的問題: 弱點說明提到:應用程式未設定 HTTP Strict Transport Security (HSTS) 標頭。這可能讓攻擊者有機會進行 HTTPS 降級攻擊,竊取敏感資訊。 什麼是 HSTS?為什麼這麼重要?HSTS 全名是 HTTP Strict Transport Security,定義於 RFC 6797,是一個 HTTP 擴充標準。它的主要功能是: 強制瀏覽器使用 HTTPS 與網站進行通訊 有效防禦 SSL 剝離攻擊 保護使用者的敏感資訊 避免憑證警告被忽略 HSTS 運作原理讓我們看看 HSTS 是如何運作的: 使用者第一次存取網站 伺服器在回應中加入 HSTS 標頭 瀏覽器記住這個安全設定 之後瀏覽器在發出請求前,會於本機直接將 HTTP 升級為 HTTPS(307 Internal Redirect),不會先送出不安全的請求 有效防止中間人攻擊 ...
WebSocket通訊過程詳解
WebSocket通訊的握手、傳輸、心跳到關閉,底層到底在做什麼?這篇把整個過程拆開來看。 WebSocket是什麼?WebSocket是一種網路通訊協定,能在瀏覽器和伺服器之間建立全雙工的通訊管道。傳統HTTP是請求—回應模式,每次都要重新建立連線;WebSocket一旦握手完成,雙方就可以隨時互相傳送訊息,連線一直維持著。 WebSocket通訊過程1. 建立連線客戶端(通常是瀏覽器)先發出一個普通的 HTTP GET 請求,帶上升級用的標頭: 1234Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Sec-WebSocket-Version: 13 Sec-WebSocket-Key 是瀏覽器隨機產生的 16 bytes,經 base64 編碼後放進去,作用是讓伺服器證明它確實理解 WebSocket 協定。 2. 伺服器回應伺服器若支援 WebSocket,回傳 HTTP 101(Switching Protocols): 123Upgrade: websoc...
使用 NSSM 將 EXE 包裝成 Windows 服務
NSSM(Non-Sucking Service Manager)是一支免費開源工具,可以把幾乎任何 EXE 包裝成 Windows 服務,讓它開機自動啟動、當掉自動重啟、並把 stdout/stderr 導向日誌檔。 版本現況:NSSM 最後一個正式釋出版是 2014 年的 2.24;預覽版 2.25 在官方 git 上持續有提交,但無正式發布日期。功能已相當完整,只是不要期待活躍的版本更新。 NSSM 與 SC 命令的差異Windows 內建的 sc.exe 可以註冊服務,但它的前提是「被包裝的程式本身已實作 Windows Service API」——也就是說要會回應 SCM 的 Start/Stop/Pause 訊號。一般的 console EXE 沒有這套邏輯,用 sc 直接包會秒停。 NSSM 的做法是自己當服務宿主,在 SCM 和你的 EXE 中間做代理:SCM 叫 NSSM 停,NSSM 再去 terminate 你的 EXE。因此任何 console 程式都能包,不需要改原始碼。 其他 SC 辦不到、NSSM 能辦到的: stdout / stderr 轉...
SQL查詢重複資料指南
資料表裡出現重複記錄,通常有幾個來源:ETL 流程沒做冪等性保護、應用層缺少唯一約束、或手動匯入時重複執行。本文介紹幾種查法與對應的效能取捨。 目錄 什麼是重複資料? 基礎查詢方法 進階查詢技巧 實務案例分析 效能優化建議 1. 什麼是重複資料?重複資料指的是在資料表中,某些欄位或欄位組合的值完全相同的記錄。例如,在員工資料表中,可能會出現相同姓名、生日和部門的多筆記錄。 2. 基礎查詢方法2.1 使用 GROUP BY 和 HAVING最基本的查詢重複資料方式是使用 GROUP BY 和 HAVING 子句: 1234SELECT 欄位1, 欄位2, COUNT(*) as 重複次數FROM 資料表GROUP BY 欄位1, 欄位2HAVING COUNT(*) > 1; 2.2 查看重複記錄的完整資訊若要查看重複記錄的所有欄位資訊,可以使用以下方式: 1234567891011WITH 重複資料 AS ( SELECT 欄位1, 欄位2 FROM 資料表 GROUP BY 欄位1, 欄位2 HAVING COUNT(*) > 1)SEL...
DuckDNS:免費且簡單的動態DNS服務
家裡的 IP 會變、沒有固定位址,想從外面連回自己的伺服器就麻煩了。DuckDNS 解決這件事:把一個固定子網域(例如 yourname.duckdns.org)指向你現在的 IP,IP 變了就更新,網域名稱不變。完全免費,架在 Amazon AWS 上,一個帳號最多五個子網域。 什麼是 DuckDNS?DuckDNS 是免費的動態 DNS 託管服務。它讓你把一個固定的子網域(例如 yourdomain.duckdns.org)指向一個會變動的 IP 位址,對沒有固定 IP 的家庭網路或小型伺服器來說很實用。 DuckDNS 的主要特點 完全免費:不收任何費用,靠捐款維持營運。 支援 IPv4 和 IPv6:兩種協定都能用。 API 支援:提供簡單的 HTTP API,方便整合到自己的應用程式或腳本。 多平台支援:官方提供 Windows、Linux、macOS、路由器、Raspberry Pi 等平台的腳本與說明。 如何使用 DuckDNS步驟 1:註冊帳號 前往 DuckDNS 官網 使用 GitHub 或 Google 帳號登入(Twitter 登入目前已停用) 步驟 ...
深入解析:處理中文數字的自訂排序函數
專案裡有個 AngularJS 畫面,scope.datalist 每筆資料的欄位開頭儲存著 (一)、(二)、(十)、(二十) 這類中文數字前綴。Array.sort 預設按 Unicode 碼位排,(一) 排在 (三) 前面沒問題,但 (十) 和 (二十) 的字元碼比個位數字大,順序就全亂了。 下面這個 customSort 把中文數字轉成阿拉伯數字再比較,支援一到九十九,沒有前綴的項目自動排到最後。 欄位名稱說明: 範例中的 Catacory 是原始資料庫欄位名稱(歷史拼錯沿用至今),不是 typo 建議,直接抄用時請換成你自己的欄位名。 完整程式碼12345678910111213141516171819202122232425262728const getNumber = (str) => { if (!str) return 100; // null / undefined / 空字串全部排到最後 const match = str.match(/^\(([一二三四五六七八九十]+)\)/); if (!match) return 100; ...
提升網頁表單驗證:從簡單檢查到全面優化
表單使用 Vue 元件,this.business.editdata 是元件的資料物件。這篇記錄從踩到 iOS Safari 日期限制的坑,到把整個 validateForm 重構的過程。 初始問題:日期驗證邏輯一開始表單只是單純使用 HTML date 的 max 跟 min 屬性來限制,結果使用者通報在蘋果手機的瀏覽器無法正常運作。iOS Safari 對 min/max 的支援不完整——選擇器本身不會將無效日期標灰,使用者可以選到範圍外的日期,且 Safari 不一定會在送出時執行 constraint validation 擋下來,相當於限制形同虛設。因此補上了 JavaScript 日期驗證: 整理以下驗證需求: 計算最小允許的開始日期(現在日期加7天)。 檢查使用者輸入的開始日期是否符合要求。 如果日期無效,自動將其修正為最早允許的日期。 程式碼如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546const today = new Date()...
CSS 偽元素指南
偽元素讓你在不碰 HTML 的前提下插入內容、選取特定部分,或者做純裝飾性的事。下面從最常用的 ::before/::after 開始,到幾個容易忽略的偽元素,逐一說明。 什麼是偽元素?偽元素讓你在文件中插入內容或選取特定部分,不需要修改 HTML 結構。語法是雙冒號 ::(基於向後相容,部分偽元素也接受舊的單冒號 : 寫法)。 CSS 偽元素列表以下是常見的 CSS 偽元素: ::before - 在元素內容之前插入生成內容 ::after - 在元素內容之後插入生成內容 ::first-line - 選取元素的第一行 ::first-letter - 選取元素的第一個字母 ::selection - 選取使用者反白的部分 ::placeholder - 選取輸入框的預設提示文字 ::marker - 選取列表項目的標記(點或數字) ::backdrop - 全螢幕元素底下的背景層 較少使用但在特定情況下很有用的偽元素: ::cue - 用於 WebVTT 字幕 ::slotted() - 用於 Web Components 中的投影內容 ::before 和 ::af...
Windows工作排程器沒有正常運作
Windows工作排程器是日常管理常用的工具,偶爾也會在最不預期的時機給你一個驚喜。 問題描述長期以來,我在設定工作排程時習慣選擇「不論使用者登入與否均執行」。這個設定一直運作正常,直到公司開始實施定期更換密碼的政策。 上週完成密碼更新後,我發現所有的排程任務都無法正常運行。仔細檢查才發現:更改密碼後,工作排程器要求重新輸入密碼,否則排程任務就會失效。 初步解決方案的困境表面上看,問題很單純——每次改密碼之後重新輸入一遍就好。但管理的任務一多、改密碼的頻率一上來,這條路就走不下去了。手動逐一更新既耗時又容易漏掉幾個。 尋找更好的解決方案我開始研究工作排程器的其他選項,注意到「不要儲存密碼。工作將只有本機資源的存取權」這個設定。 第一個念頭是:這樣不就所有需要連網路的任務都掛了?但實際測試之後,情況比預想中好得多。 測試結果實際測試的結論: 大多數本機任務都能正常運行。 需要存取網路共享或網路磁碟機的任務確實受到影響,無法正常執行。 其他形式的網路操作(如發送郵件、存取網站等)仍然可以正常運作。 最終解決方案依據測試結果,採用以下策略: 不需要存取網路共享的任務,改用「不要儲...




