在軟體開發的世界裡,有一種痛叫做「維護古董級系統」。這次的主角是一個運作多年、基於 ASP.NET Web Forms 打造的火鍋店優惠券系統。雖然它忠實地服務了許久,但面對當前高併發的行銷活動與現代化的 LINE 整合需求,這套老舊的體質已經漸顯疲態。加上 Windows Server 與 SQL Server 的授權與維護成本日益增加。契機是客戶這次有新需求,需要針對客戶需求開發新功能,既然都要動程式了,不如來個徹底的系統轉生。

我們的目標非常明確:全系統遷移至 .NET 10 與 PostgreSQL

為什麼非換不可?

老實說,決定「推倒重來」是需要勇氣的。但以下幾個痛點讓我們下定決心:

  1. 維護成本高昂:Windows Server 的授權費與維護心力一年比一年重,且作業系統 Server 2012 已於 2023 年 EOS。
  2. 開發效率低落:Web Forms 的開發模式與現代前端技術(如 LIFF、Next.js)脫軌,整合起來非常痛苦。
  3. 擴展性受限:舊有的資料庫架構難以支援複雜的分眾行銷與大數據分析。

技術棧的轉身:擁抱 Linux 與 Open Source

這次轉生的核心戰略,就是徹底脫離微軟的舊架構,走向更廣闊的開源世界:

  • 核心框架:由 .NET Framework 4.x 直接跨越到 .NET 10。享受跨平台的極致效能與現代 C# 語法的開發便利。
  • 資料庫:捨棄 SQL Server,轉向強大的 PostgreSQL
  • 部署環境:透過 Docker 容器化,部署在 Linux 伺服器上(我們選擇在 Vultr 使用 CapRover),維護成本直接砍半。

AI 驅動的系統轉生計畫:藉由 Codex 實現高效遷移

我們以 Codex 開發平台作為核心,這不只是單純的程式碼生成,更是將其定位為「舊邏輯的解密翻譯機」。面對 Web Forms 那些動輒數千行、邏輯交織的 .aspx.cs 檔案,我們利用 AI 快速提取業務規則,並精準重構成現代化的 API 與 Hooks。整個轉生計畫分為五個階段,僅費時約三週便平安落地。

階段 1:地基工程 —— 打破單體,鋪設現代化管線

這是整場計畫的起點。以往 Web Forms 那種「前後端耦合」的架構,隨著用戶數增長已成為維護上的負擔。我們首先將底層基礎徹底打掉重練,換上更輕量的 Linux 容器化環境。這部分最大的效益在於首日便跑通了 CI/CD,讓後續的開發與上線流程都能在幾秒鐘內自動完成。

  • 前後端分離:建立專門的 .NET 10 Web APIReact 專案,讓開發邏輯完全解耦。
  • Codex 快速腳手架:利用 AI 快速生成基礎數據表與靜態官網,節省了大量重複性的基礎勞力。
  • 容器化部署:選用 CapRover + Docker,解除 Windows 授權費限制,也大幅降低運維成本。

階段 2:前線突擊 —— LIFF 應用全面優化

LINE LIFF 是使用者最頻繁接觸的窗口,舊版每次開啟時的「白畫面」等待時間,對使用者體驗傷害很大。我們引導 Codex 參考舊有的 .aspx.cs 業務邏輯,改用 React Hooks 重新封裝。除了功能平移,更針對頁面流暢度進行深度優化,讓操作體驗變得非常順滑。

  • 邏輯精確移植:透過 AI 協助,將複雜的 Web Forms 業務規則轉換為乾淨的 API 介面。
  • UX 流暢度提升:導入 Skeleton Screen 與過渡動畫,解決舊版加載時的停頓感。
  • 高效快取機制:前端 React 搭配 API 層的快取設定,讓使用者查券、領券的反應速度接近瞬發。

階段 3:核心功能 —— 背景任務引擎 (Background Tasks)

過去發送優惠券與生日禮的排程,散落在多個掛載於 Windows 排程器上的 .exe 檔案,極難監控與管理。這次我們將任務全數收編,改用 Quartz.NET 進行核心集成。現在我們可以直接在應用程式內監控所有任務狀態,再也不必擔心單線程任務阻塞 Web Server。

  • 任務非同步化:以前發券常遇到 Request Timeout,現在轉由背景 Queue 處理,系統穩定度大幅增加。
  • Quartz.NET 排程器:實現精細化的任務調度,從分鐘級的狀態檢核到年度的生日自動發放皆能自動化運行。
  • 故障補償機制:設計了完整的 Job Retry 邏輯,確保在 API 或網路不穩時也能自動補發,保障使用者權益。

階段 4:操控中心 —— 現代化 React 管理後台

後台系統是營運人員的作業核心。相比 Web Forms 每次修改都需要長時間編譯,Vite 的熱更新效率讓開發體驗有了質的飛躍。我們選用 Radix UI 建立標準化的元件庫,並特別設計了一個專屬的 Migration Dashboard,用來監控數萬筆數據的遷移狀況。

  • Vite + React 18:開發效率顯著提升,HMR (Hot Module Replacement) 幾乎消除了所有等待建置的時間。
  • Radix UI 規範化:建立標準化 UI 元件,讓後續擴充功能像拼積木一樣快速。
  • 遷移監控看板:專門為系統轉換設計的圖像化介面,確保每筆數據都能精確地從 SQL Server 搬遷至 PostgreSQL。

階段 5:數據重生 —— 百萬數據平安落地

這是遷移中最關鍵的一環。SQL Server 轉 PostgreSQL 存在許多型別坑,如大小寫敏感、bit 轉換以及序列自增等問題。我利用 AI 開發了一套遷移工具介面,並在測試環境中反覆針對邊界情況進行壓力測試與驗證。當遷移邏輯確認完美後,才正式執行正式環境的搬遷。

  • SqlSugar 跨庫引擎:同時操控兩個資料庫 Provider,實現高效的 Batching 分批搬遷,大幅縮短停機時間。
  • 數據自動修復:遷移過程中自動檢查圖片路徑、校準資料表序列 (Sequence Alignment),確保遷移後功能立即運作。
  • 嚴謹驗證流程:包含總筆數核對與隨機欄位的抽樣比對 (Detailed Verify),確保數據在大換血後依然完整無誤。

[!IMPORTANT]
這套遷移流程不僅解決了底層資料庫的差異,更完成了一次全面性的數據健檢,徹底清理了累積多年的沉贅資料。

轉生前後對照:不只是效能,更是維運的跨代飛躍

維度 舊系統 (Web Forms) 新架構 (.NET 10 + React)
部署環境 Windows Server (IIS) Linux Container (Docker/CapRover)
資料庫 MS SQL Server (授權費貴) PostgreSQL (開源高效)
開發模式 前後端強耦合 (Slow) API + React 分離 (Fast & Clean)
維修與更新 每次修改需長時間編譯 Vite HMR 瞬發更新
基礎設施成本 高額 Windows 授權費 節省約 60% 的主機月開銷

結語

從 Web Forms 到 .NET 10 的路雖然辛苦,但看到系統能在 Linux 上穩定運行、載入速度提升數倍、且維護費用大幅降低,所有的努力都值得了。

[!TIP]
延伸閱讀:關於這次重構中「如何解決跨 Provider 的 LINE UserId 綁定問題」,可以參考我的另一篇實錄:LINE Login 與 LINE Messaging API 整合實錄:揮別技術債,邁向自動化行銷的轉生之路