從 CommunityServer 2007 到 BlogEngine.NET
問題與答案 (FAQ)
Q&A 類別 A: 概念理解類
A-Q1: 什麼是 CommunityServer 2007?
- A簡: CommunityServer 2007 是整合部落格、文章、論壇的成熟網站平台。
- A詳: CommunityServer 2007 是一套企業級社群平台,整合部落格、文章(Article)、論壇、相簿等功能,具備完整權限與元件化架構,適合多站台與大型社群。其功能完整但系統龐大,客製化門檻相對較高,維護成本也較高。本文即描述從該平台遷移至較輕量的 BlogEngine.NET 的過程與取捨。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q5, A-Q9, A-Q25
A-Q2: 什麼是 BlogEngine.NET?
- A簡: BlogEngine.NET 是以 ASP.NET 實作的輕量可擴充部落格引擎。
- A詳: BlogEngine.NET 是開源的 ASP.NET 部落格系統,特色是程式碼精實、架構清晰、擴充容易。採用 Master/UserControl,共有 Extension 架構可快速加裝功能(如瀏覽次數)。相較 CommunityServer,功能聚焦於部落格本身,開發環境易建,客製與維護成本低,適合個人與中小型站台。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q5, A-Q12, B-Q9
A-Q3: 什麼是 BlogML?
- A簡: BlogML 是用於跨部落格平台的部落格資料交換格式。
- A詳: BlogML(Blog Markup Language)是一種 XML 標準,專門用於匯出與匯入部落格資料(文章、分類、標籤、留言等)。許多平台支援 BlogML,使搬家能以標準格式轉移內容。本文以 CommunityServer 匯出 BlogML,再由 BlogEngine.NET 官方匯入工具(ClickOnce + Web Service)匯入。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q1, B-Q13, C-Q1
A-Q4: 為什麼從 CommunityServer 遷移到 BlogEngine.NET?
- A簡: 為追求輕量易改、擴充簡單、開發環境好建與維護性更佳。
- A詳: 遷移動機包括:BlogEngine.NET 程式碼精實、架構清楚、擴充(Extension)容易、Master/UserControl 模式好改版、開發環境快速搭起;相較 CommunityServer 的龐大與複雜,BlogEngine.NET 修改難度約為其 1/3。移轉也藉機清理舊自訂功能,聚焦必要能力。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q5, A-Q12, A-Q25
A-Q5: CommunityServer 與 BlogEngine.NET 的核心差異?
- A簡: 前者功能整合龐大,後者聚焦部落格、架構精簡易擴充。
- A詳: CommunityServer 是整合式社群平台,提供文章、論壇等眾多模組,適合大型社群;BlogEngine.NET 專注於部落格,採 Extension 擴充、Master/UserControl 版型,程式碼量少、可讀性高,客製容易。遷移時需補齊某些功能(如瀏覽數),但換得維護與開發效率。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q2, A-Q12, A-Q25
A-Q6: 為什麼需要使用 BlogML 匯出/匯入?
- A簡: BlogML 提供跨平台標準格式,降低搬家風險與人工轉換。
- A詳: 異平台搬遷的核心在於資料可攜性。BlogML 將文章、分類、留言等以 XML 標準打包,避免手動搬遷錯漏。CommunityServer 有匯出工具,BlogEngine.NET 有匯入工具,能快速完成大部分內容轉移,再搭配後續連結修正與擴充補強,顯著降低成本。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q3, B-Q1, C-Q2
A-Q7: 什麼是 ClickOnce 匯入工具?
- A簡: 由官方提供的 WinForm 應用,透過 Web Service 匯入 BlogML。
- A詳: BlogEngine.NET 的匯入方式使用 ClickOnce 部署的 WinForm 工具,直接從官方網站啟動。它連線至目標 BlogEngine.NET 的 Web Service 端點,將 BlogML 內的內容提交並建立文章等資料。此方式簡化部署與更新,但需正確設定服務端點與權限。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q2, C-Q2, D-Q2
A-Q8: Windows Live Writer 絕對網址問題是什麼?
- A簡: WLW 上傳圖片常用絕對網址,搬家後仍指向舊站。
- A詳: Windows Live Writer 為方便預覽,常將圖片連結寫為包含域名的絕對網址。搬家後網頁仍連回舊站,導致資源分散、管理不便,甚至舊站下線時圖片失聯。需批次轉成新站內相對或新域名絕對路徑,確保資產歸位與效能。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q4, C-Q4, D-Q3
A-Q9: CommunityServer 中 Blog 與 Article 的差異?
- A簡: Blog 為一般貼文,Article 為另一類型內容,匯入受影響。
- A詳: CommunityServer 文章可分 Blog 貼文與 Article(文章模組)。兩者存放與標記不同。匯出 BlogML 時會同時包含,但若目標匯入器只處理 Blog 類型,Article 可能被略過,造成內容遺漏。需自訂匯入流程將 Article 轉為 BlogEngine.NET 貼文。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q5, C-Q5, D-Q4
A-Q10: 為什麼搬家會造成站內與站外連結問題?
- A簡: URL 結構、域名與連結型式改變,導致內外鏈斷裂。
- A詳: 搬遷涉及域名、目錄結構或永久連結格式改變。站內連結多為舊結構,需重寫;站外(其他網站)仍指向舊網址,成為 404,流量受損。需執行兩階段連結修正與舊址相容轉址策略,恢復可達性並保留參照價值。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q13, A-Q14, B-Q7
A-Q11: 什麼是 View Count/Counter?為什麼重要?
- A簡: 文章瀏覽次數指標;衡量熱度、引導優化與推薦。
- A詳: View Count 記錄文章被瀏覽的次數,是內容成效的重要量化指標。可用於熱門文章排序、內容優化與營運分析。BlogEngine.NET 預設未內建,需靠 Extension 補強;舊站資料也需遷移,維持歷史價值與趨勢連續性。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q10, C-Q7, C-Q8
A-Q12: BlogEngine.NET Extension 架構的核心價值?
- A簡: 以擴充點快速增能,降低改核心程式之風險。
- A詳: Extension 架構提供鉤子(Hooks)或事件(如 OnPostServing)讓開發者注入行為,無須修改核心程式碼。可封裝功能(如 View Count)、設定與持久化,易於部署與維護。遷移時可藉此補齊缺件與自訂需求,維持升級相容性。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q9, C-Q7, C-Q8
A-Q13: 什麼是兩階段匯入(2 PASS)?
- A簡: 先匯入建立新文章與網址,再二次回寫修正內部連結。
- A詳: 2 PASS 流程第一階段完成基本匯入並記錄新文章的 PostID/URL 與舊連結的對應表;第二階段重讀舊文章內容,將站內舊連結 Search & Replace 為新連結。此法解決轉檔前無法預知新 URL 的困境,確保內部互連正確。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q6, C-Q6, D-Q7
A-Q14: 什麼是舊網址相容轉址?
- A簡: 接受舊格式 URL,判斷後導向對應的新文章網址。
- A詳: 為維持外部連結可用與 SEO,伺服器需攔截 CommunityServer 舊格式 URL,解析出關鍵資訊(ID/Slug/日期),查表映射到 BlogEngine.NET 新網址,顯示提示頁倒數後轉跳。此舉避免大量 404,修復外部參照價值與流量損失。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, C-Q10, D-Q8
A-Q15: 為何時區會導致匯入錯誤?
- A簡: 不正確日期解析遇到時區校正,出現負值觸發例外。
- A詳: 匯入器將修改時間讀成無效日期(例如 0001-01-01),再套用時區校正(台灣標準時間相對 UTC-8),造成負偏移或不合法日期,拋出例外。需在匯入時檢查日期有效性或移除該校正,確保時間欄位正確處理。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q3, C-Q3, D-Q2
A-Q16: 匯入工具使用 Web Service 的意義?
- A簡: 透過服務端點安全寫入內容,簡化部署與權限控制。
- A詳: Web Service 提供標準端點,匯入工具可跨網路提交 BlogML 內容,伺服器端驗證身分、套用商業邏輯後入庫。優點是部署簡單、版本一致;也可集中權限與日誌控管,便於追蹤和回溯,減少直接操作資料庫的風險。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q2, B-Q18, D-Q1
A-Q17: 什麼是 Master Page 與 UserControl 架構?
- A簡: ASP.NET 版型與組件機制,便於一致外觀與模組化。
- A詳: Master Page 定義網站共同骨架(頁首、側欄、頁尾),ContentPlaceHolder 填入各頁內容;UserControl 封裝可重用區塊(如側欄元件)。BlogEngine.NET 版面即採此架構,利於加廣告、加自訂控制項與調整樣式而不影響核心功能。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q11, C-Q9, A-Q12
A-Q18: 整合 Google Ads 的考量是什麼?
- A簡: 版面佈局、樣式一致性、載入效能與使用者體驗。
- A詳: 廣告需與版型協調(CSS/色系),放置於視覺熱區但不干擾閱讀。考量載入次序避免阻塞,採非同步載入。Master Page 可集中放置,UserControl 可封裝版位。良好整合提升收益與體驗,避免跳出率增加。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q12, C-Q9, D-Q5
A-Q19: 什麼是 Bot Check?
- A簡: 防止自動化濫用(垃圾留言/爬蟲)的人機驗證機制。
- A詳: Bot Check 常透過簡單問答、圖形驗證碼或行為分析,阻擋自動化垃圾行為。遷移時需評估新平台擴充點與相容性,逐步移植或替換。未完成前可暫採審核制或限制頻率,降低風險。本文中此項仍待改造。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q9, D-Q9, A-Q12
A-Q20: 什麼是 Code Formatter 配合?
- A簡: 讓程式碼片段在部落格中高亮並正確排版。
- A詳: Code Formatter 需在編輯端與顯示端協作:編輯端產生標記(如 pre/code 與語言屬性),顯示端載入高亮腳本與樣式。遷移時需確認新平台的標記相容與載入流程,避免程式碼破版或腳本衝突。本文提及需與 Blog Server 配合。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q20, C-Q6, D-Q10
A-Q21: 為什麼要篩選保留或清理自訂功能?
- A簡: 聚焦必要功能,減少維護負擔,避免技術債延續。
- A詳: 搬家是技術整頓契機。審視現有自訂功能(如已內建的 Recent Comments、已不使用的外掛),能刪冗保精,降低複雜度與缺陷面積。保留有價值者(如 View Count、廣告),逐步重構至 Extension,利於未來升級與維護。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q12, C-Q7, C-Q8
A-Q22: 為什麼搬家後 Page View 可能下降?
- A簡: 舊連結失效與索引變更導致 404 與流量流失。
- A詳: 變更網址結構會讓搜尋引擎索引與外部連結失效,訪客點擊轉為 404,PV 暫降。應快速建立舊址相容轉址、修正站內連結、提交新站點地圖。短期波動屬正常,修復連結與時效後可恢復並提升。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q10, A-Q14, D-Q5
A-Q23: 為什麼要顯示提示頁而非靜默轉址?
- A簡: 透明溝通變更、避免掩蓋錯誤、利於除錯與追蹤。
- A詳: 提示頁倒數轉址能向使用者說明搬遷與新網址,並提供可見的過程訊息。若直接靜默轉址,問題被隱藏難以發現來源。提示頁也可記錄轉址日誌,利於分析舊連結來源,逐步通知外站更新。屬防禦式程式設計實踐。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q19, D-Q8, B-Q18
A-Q24: 什麼是「開發環境容易上手」的意義?
- A簡: 取得原始碼、建置與除錯流程直觀,降低改動成本。
- A詳: 環境好建代表專案依賴少、解決方案結構清晰、可直接在 VS 啟動、易追蹤與擴充。本文提到 BlogEngine.NET 代碼量少、架構清楚,開發者能快速進入狀況並安全修改,對持續改造與維護極為關鍵。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q16, B-Q25, A-Q12
A-Q25: 兩者在可維護性上的比較?
- A簡: BlogEngine.NET 輕量好改,CommunityServer 功能強但複雜。
- A詳: CommunityServer 功能全面但因早期自研大量基礎架構,相對複雜,修改門檻高;BlogEngine.NET 採現代 ASP.NET 範式,程式碼精實、擴充清楚、修改難度較低。遷移可換得較佳可維護性與後續演進敏捷度。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q4, B-Q25, A-Q12
Q&A 類別 B: 技術原理類
B-Q1: BlogML 匯出與匯入如何運作?
- A簡: 以 XML 描述部落格結構,來源匯出、目標解析建置內容。
- A詳: BlogML 將文章、分類、標籤、留言等以 XML 節點表述。來源平台匯出 BlogML;目標匯入器解析 XML,依序建立分類、文章、留言等並維持關聯。關鍵步驟包括:解析標題/內文/時間、建立映射表、處理附件與圖片。核心組件為 XML 解析器與寫入 API。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q3, C-Q1, C-Q2
B-Q2: BlogEngine.NET 匯入器(ClickOnce+Web Service)如何運作?
- A簡: 客端 WinForm 讀 BlogML,呼叫站台 Web Service 建文與關聯。
- A詳: 匯入器由 ClickOnce 部署的 WinForm 應用組成。流程:讀入 BlogML → 連線 BlogEngine.NET Web Service → 逐項發送建立分類/文章/留言請求 → 伺服端驗證與持久化 → 回傳新 ID。核心組件:HTTP 客戶端、序列化/反序列化、錯誤處理與重試機制、伺服端 API 端點。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q7, A-Q16, D-Q2
B-Q3: 時區與日期解析錯誤背後機制是什麼?
- A簡: 無效日期值遭套用時區偏移,產生不合法時間拋例外。
- A詳: 當來源日期缺漏或格式不符時,解析結果可能為 DateTime.MinValue 或未指明 Kind。若再套用時區修正(如台灣 -8),會導致負溢位或不合理值。解法是在解析階段驗證值、設定 Kind、只對有效日期轉時區。核心組件:日期解析器、時區轉換器、驗證器。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q15, C-Q3, D-Q2
B-Q4: 絕對連結與相對連結的機制差異?
- A簡: 絕對含完整域名,跨域穩定;相對依上下文,搬遷彈性大。
- A詳: 絕對連結如 https://old/site/a.png,解析穩定但搬站會殘留舊域。相對連結如 /images/a.png 或 ./a.png,受當前站點解析,搬家時可自動指向新站。修正策略常以正規表達式批次將舊域絕對連結改為新域或相對路徑。核心:URL 解析、正規替換。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q8, C-Q4, D-Q3
B-Q5: CommunityServer 的 Article 與 Blog 結構差異如何影響匯入?
- A簡: 類型標記不同,匯入器若僅處理 Blog,Article 會被略過。
- A詳: Blog 與 Article 在匯出 BlogML 時可能以不同類型或命名空間標記。若目標匯入器只針對 Blog 節點,則 Article 資料不會建立。需擴充匯入器解析 Article 節點,將其映射為 BlogEngine.NET 貼文。核心:XML 節點分類、映射策略、資料欄位對應。
- 難度: 高級
- 學習階段: 進階
- 關聯概念: A-Q9, C-Q5, D-Q4
B-Q6: 站內連結修正的兩階段(2 PASS)機制?
- A簡: 首輪建文產生新 URL,次輪依映射回寫替換內文連結。
- A詳: PASS1:匯入文章,記錄舊連結→新 PostID/URL 的映射表。PASS2:遍歷原文內容,以 Regex 搜舊站內連結,查映射表替換為新 URL,再更新文章。核心組件:映射儲存(字典/檔案)、Regex 搜尋替換、文章更新 API、回滾策略。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q13, C-Q6, D-Q7
B-Q7: 舊網址相容轉址的技術架構?
- A簡: 路由或 HTTP 模組攔截舊格式,解析映射並顯示提示頁轉址。
- A詳: 以路由或 HttpModule 解析舊 URL(如 /post/yyyy/mm/dd/slug.aspx),萃取鍵值查映射表取得新 URL。回應先輸出提示頁含倒數與連結,再轉址。需處理找不到映射時回 404。核心:路由規則、映射儲存、提示頁模板、轉址流程。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q14, C-Q10, D-Q8
B-Q8: 為何 404 會導致 PV 降低?
- A簡: 404 中斷使用者路徑與搜尋引擎信任,降低有效瀏覽。
- A詳: 舊連結指向不存在頁面時,使用者無法抵達內容,PV 下降;搜尋引擎遇大量 404 會降低站點品質評估,影響收錄與排名。修復手段:舊址相容、站內連結修正、站點地圖更新與重新提交索引。核心:HTTP 狀態、SEO 基礎、使用者行為。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q22, D-Q5, B-Q7
B-Q9: BlogEngine.NET Extension 架構如何設計?
- A簡: 透過事件鉤子注入邏輯,封裝設定與儲存,便於部署。
- A詳: Extension 以屬性與事件(如 Serving)掛載於生命週期節點,能在輸出前後修改內容或記錄資料。通常放於 App_Code/Extensions 或特定目錄,支援開關設定。可自帶設定 UI 與儲存(XML/DB)。核心:事件管線、設定管理、可插拔設計。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q12, C-Q7, C-Q8
B-Q10: View Count Extension 的運作流程?
- A簡: 在文章瀏覽時攔截事件,累加計數並持久化顯示。
- A詳: 擴充在文章頁 Serving 或 PostView 事件中觸發,判斷唯一訪問(可用 Cookie/IP/時間窗),累加文章計數;再將數值儲存於資料源(XML/DB/自訂檔),並於模板/側欄呈現。核心組件:唯一性判斷、儲存層、顯示模板整合。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q11, C-Q7, D-Q6
B-Q11: Master Page/UserControl 如何構成版面?
- A簡: Master 定義骨架,UserControl 填模組,樣式以 CSS 控制。
- A詳: Master Page 包含共用區塊與 ContentPlaceHolder,頁面繼承並注入內容;UserControl 封裝功能模組(如 Recent Posts、廣告位),可重用於側欄或頁身。樣式透過 CSS 管控一致性。核心:ASP.NET 頁面生命週期、控制樹、樣式覆寫。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q17, C-Q9, B-Q12
B-Q12: CSS 調整與廣告版位整合的原理?
- A簡: 以樣式層控制色系與版面,非同步載入廣告腳本。
- A詳: 透過 CSS 調整字體、色彩、間距讓廣告融入主題;以容器(div/aside)定義版位,避免內容跳動;廣告腳本建議 async/defer,減少阻塞。核心:層疊優先順序、響應式版面、非同步資源載入與 CLS 控制。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q18, C-Q9, D-Q5
B-Q13: RSS 匯入與 BlogML 匯入的差異與限制?
- A簡: RSS 多為摘要與基本欄位,BlogML 完整且結構化。
- A詳: RSS 主要供聚合閱讀,欄位較簡略(常無完整留言、分類關聯或附件資訊),且格式非為搬家設計;BlogML 專為遷移,包含完整結構。本文測試 RSS 匯入未成功,故改用 BlogML。核心:資料覆蓋度、欄位對應、工具支援。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q3, D-Q1, C-Q2
B-Q14: Windows Live Writer 上傳圖片的連結處理?
- A簡: 預設寫入絕對網址,需後處理改為新站或相對路徑。
- A詳: WLW 會將圖片發佈至媒體端點並以絕對 URL 內嵌文章。搬站後需掃描文章內容,找出舊域圖片連結,批次改為新域名或 CDN/相對路徑,確保資產在新站可用。核心:內容掃描、URL 重寫、穩健的 Regex 與防誤傷策略。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q8, C-Q4, D-Q3
B-Q15: 內文搜尋替換(Regex)如何實現連結更新?
- A簡: 以正規表達式擷取舊鏈模式,查映射替換為新 URL。
- A詳: 定義匹配模式(如 http(s)://old.site/…),使用 Regex 遍歷文章 HTML,對站內鏈接以映射表替換新 URL,站外鏈可保留或標記。需避免替換到程式碼區塊或屬性值外部。核心:Regex 分組、HTML 感知處理、回溯限制與效能控制。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q6, C-Q6, D-Q7
B-Q16: 開發環境建置流程?
- A簡: 取得原始碼→還原相依→設定站台→VS 編譯除錯。
- A詳: 下載 BlogEngine.NET 源碼,還原 NuGet 相依,建立 IIS Express/本機站台與資料目錄,設定 web.config,於 VS 啟動調試。採用原始碼清晰與模組化設計,能快速定位與調整匯入器、擴充與版面。核心:專案結構、設定檔、偵錯技巧。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q24, C-Q2, C-Q7
B-Q17: 例外處理與防禦式程式設計(ASSERT/TRACE)的角色?
- A簡: 及早暴露異常與假設違反,便於追蹤並修正問題。
- A詳: 防禦式設計在關鍵點檢查輸入與狀態,若不符預期以 ASSERT/TRACE 記錄與中止路徑,避免靜默錯誤。本文將轉址設計為顯示提示頁,即是透明暴露問題的實踐。核心:輸入驗證、日誌、可觀測性與失敗快速原則。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q23, B-Q18, D-Q2
B-Q18: 日誌與錯誤追蹤如何定位搬家問題?
- A簡: 收集 404/例外/轉址來源,分析模式與優先修復。
- A詳: 啟用應用層日誌與 HTTP 記錄,紀錄 404 路徑、Referer、UserAgent、例外堆疊。對轉址提示頁記錄來源舊 URL 與映射結果。以資料驅動排程修正(先修熱門路徑),持續迭代直至錯誤下降趨穩。核心:集中式日誌、指標與告警。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: D-Q5, A-Q23, C-Q10
B-Q19: 倒數提示頁的使用者體驗設計?
- A簡: 清楚說明、可跳過、顯示新連結,兼顧可用與透明。
- A詳: 提示頁包含:遷移說明、新網址超連結、N 秒倒數、自動轉跳、故障時可手動點擊。避免過長等待,並對無腳本環境提供 noscript 連結。核心:可用性、無障礙、容錯與跨裝置支援。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q23, C-Q10, D-Q8
B-Q20: 與 Blog Server 的 Code Formatter 整合點?
- A簡: 編輯端產生標記,顯示端載入語法高亮資源並渲染。
- A詳: 編輯器(WLW/Markdown)輸出帶語言標記的 code/pre;前端佈景載入對應 JS/CSS(如 highlight.js),在 Serving 時機處理 DOM 渲染。需確保與主題樣式相容、避免與其他腳本衝突。核心:渲染掛鉤、資源管線、降級策略。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q20, C-Q6, D-Q10
B-Q21: 文章修改時間欄位與資料模型?
- A簡: 包含建立、修改、發佈時間,需正確解析與時區處理。
- A詳: 模型通常含 CreatedUtc、UpdatedUtc、PublishedUtc 等欄位。匯入應優先採用 UTC 儲存,顯示時轉為本地。遇缺漏或無效值需給預設或忽略時區調整,避免非法日期。核心:DateTimeKind、UTC/Local 轉換、欄位對應策略。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q3, C-Q3, D-Q2
B-Q22: 轉址安全與避免迴圈的機制?
- A簡: 僅攔舊格式、白名單域名、加防重導檢查避免迴圈。
- A詳: 在攔截器中先判斷是否已是新站域或新格式,符合則放行;僅對符合舊規則的 URL 嘗試映射。加上標記(Query 或 Header)識別已處理,避免再次攔截。無映射時回 404。核心:規則順序、旗標、白名單/黑名單控制。
- 難度: 高級
- 學習階段: 進階
- 關聯概念: B-Q7, C-Q10, D-Q8
B-Q23: 與外部網站連結維護策略?
- A簡: 建立相容轉址、聯繫重要外站更新、監控壞鏈。
- A詳: 施作舊址相容減少斷鏈,同時聯繫高流量引用站更新連結。持續以日誌監控 404,針對常見路徑建立特例映射。必要時維持舊域靜態鏡像關鍵資源。核心:合作溝通、監控告警、特例處理與資產管理。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q14, B-Q8, D-Q8
B-Q24: 相容舊永久連結(Permalink)策略?
- A簡: 保留 slug/日期元素映射,盡量一對一自動轉址。
- A詳: 設計規則提取舊 permalink 的年月日、slug 或 ID,建立映射器優先按 slug 比對,找不到再回退 ID/日期近似。確保轉址穩定與最小化歧義。核心:規則優先順序、映射資料源、衝突處理與測試覆蓋。
- 難度: 高級
- 學習階段: 進階
- 關聯概念: B-Q7, C-Q10, D-Q8
B-Q25: 程式碼精實性與可修改性的特徵?
- A簡: 模組清晰、依賴少、命名一致、測試與文件齊備。
- A詳: 精實程式碼具有低耦合高內聚、清晰邏輯層次、命名慣例、一致錯誤處理、可觀測性良好,易於閱讀與修改。本文稱讚 BlogEngine.NET 架構規整、代碼量少,讓修改舒適度高。核心:設計原則、可維護性度量、重構策略。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q24, A-Q25, C-Q6
Q&A 類別 C: 實作應用類
C-Q1: 如何用 CommunityServer 2007 匯出 BlogML?
- A簡: 安裝官方工具,選擇部落格實例,匯出為 BlogML 檔案。
- A詳: 步驟:1) 前往 CodePlex/官方來源取得 CommunityServer BlogML 匯出工具;2) 指定欲匯出的部落格與範圍(含文章、分類、留言);3) 產生 BlogML XML 檔。程式碼/設定:確保有權限與連線設定。注意:包含 Article 節點以利後續自訂匯入。最佳實踐:先備份資料庫、驗證輸出。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q3, B-Q1, C-Q2
C-Q2: 如何使用 BlogEngine.NET ClickOnce 匯入 BlogML?
- A簡: 啟動 ClickOnce 匯入器,連線站台 Web Service,上傳 BlogML。
- A詳: 步驟:1) 從 BlogEngine.NET 官方啟動 ClickOnce 匯入器;2) 輸入目標站台 URL 與管理帳密;3) 指定 BlogML 檔並開始匯入;4) 監看日誌與錯誤。關鍵設定:Web Service 端點可用、帳號權限足夠。注意:RSS 匯入若失敗,改用 BlogML。最佳實踐:小量測試後再全量。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q7, B-Q2, D-Q1
C-Q3: 如何修正匯入時的日期 0001-01-01 例外?
- A簡: 在匯入程式判斷日期有效性,避免對無效值做時區換算。
- A詳: 步驟:1) 取得匯入器原始碼;2) 在日期解析後加入檢查 if (date <= DateTime.MinValue) 跳過或給預設;3) 僅對有效 DateTime 且 Kind==Utc/Local 正確轉換;4) 重新編譯部署。程式碼:if (dt == DateTime.MinValue) { /skip/ }. 注意:避免負偏移。最佳實踐:加 TRACE 記錄異常資料列。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q3, B-Q21, D-Q2
C-Q4: 如何批次修正 WLW 絕對圖片連結?
- A簡: 以 Regex 搜尋舊域圖片 URL,替換為新域或相對路徑。
-
A詳: 步驟:1) 匯出或遍歷文章 HTML;2) Regex 匹配 (https?://old.site/[^”]+.(png jpg gif));3) 將群組替換為新域或 /images/…;4) 更新文章儲存。程式碼:Regex.Replace(html, pattern, m => m.Value.Replace(“old.site”,”new.site”)). 注意:避免影響外站連結。最佳:先乾跑(dry run)比對差異。 - 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q4, B-Q14, D-Q3
C-Q5: 如何將 CommunityServer 的 Article 匯入為 BlogEngine.NET 文章?
- A簡: 擴充匯入器解析 Article 節點,映射欄位建立貼文。
- A詳: 步驟:1) 研究 BlogML 內 Article 標記或命名空間;2) 擴充匯入器解析該節點集合;3) 映射標題、內文、時間、分類至 BlogEngine.NET Post;4) 建立後記錄映射。程式碼:使用 XDocument 遍歷指定節點並呼叫 Post API。注意:狀態(草稿/發佈)與權限對應。最佳:先少量測試。
- 難度: 高級
- 學習階段: 進階
- 關聯概念: B-Q5, A-Q9, D-Q4
C-Q6: 如何實作 2 PASS 站內連結修正?
- A簡: PASS1 建立映射表,PASS2 以 Regex 依表替換舊鏈為新鏈。
- A詳: 步驟:1) PASS1 匯入文章並儲存 oldUrl→newUrl 字典(CSV/JSON);2) PASS2 遍歷文章內容,Regex 找出站內舊鏈,以字典替換;3) 更新文章。程式碼:Dictionary<string,string> map; Regex.Matches→Replace。注意:避免替換程式碼區段。最佳:加日誌與回滾機制。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q6, B-Q15, A-Q13
C-Q7: 如何在 BlogEngine.NET 安裝 View Count Extension?
- A簡: 下載擴充檔,置於 Extensions 目錄,啟用並測試顯示。
- A詳: 步驟:1) 取得 View Count Extension(如社群提供版);2) 放入 App_Code/Extensions 或指定資料夾;3) 後台啟用擴充;4) 於佈景模板插入顯示標籤或控制項。程式碼:在 PostView 加入顯示欄位。注意:避免機器人影響計數。最佳:加入唯一性判斷與快取。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q11, B-Q10, D-Q6
C-Q8: 如何匯入舊 View Count 到 BlogEngine.NET?
- A簡: 匯出舊計數,建立 Post 映射,批次寫入新系統儲存。
- A詳: 步驟:1) 從舊站導出文章 ID 與 ViewCount;2) 建立 oldId/slug→newPostId 映射;3) 編寫工具讀取 CSV,呼叫擴充或 API 更新新系統計數;4) 驗證呈現。程式碼:foreach(map) UpdateView(postId, count)。注意:避免覆蓋新計數。最佳:合併策略=max 或 sum。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q10, A-Q12, D-Q6
C-Q9: 如何調整 CSS 與 Master Page 放置 Google Ads?
- A簡: 在 Master Page 加入容器,CSS 設計版位,載入廣告腳本。
- A詳: 步驟:1) 修改 Site.master,於側欄/文末加入 <div id="ad-slot">;2) 置入 Ads 腳本(async);3) style.css 設計寬高與留白;4) 測試桌機/行動版。程式碼:。注意:避免阻塞與 CLS。最佳:lazy-load 不在首屏的廣告。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q11, B-Q12, A-Q18
C-Q10: 如何設計舊網址相容與提示頁轉址?
- A簡: 建 HttpModule/路由解析舊鏈,輸出提示頁後再導向新鏈。
- A詳: 步驟:1) 定義 Regex 規則匹配舊 URL;2) 依鍵值查映射表得新 URL;3) 回應提示頁(含倒數與新連結);4) 客端或伺服器端轉址。程式碼:Application_BeginRequest 中攔截與 Response.Write 提示頁。注意:避免迴圈與開放轉址。最佳:記錄日誌以便修補。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, B-Q22, D-Q8
Q&A 類別 D: 問題解決類
D-Q1: 匯入 RSS 失敗怎麼辦?
- A簡: 改用 BlogML 匯入;RSS 欄位不足且工具支援有限。
- A詳: 症狀:使用 RSS 匯入無反應或錯誤。原因:RSS 非為搬遷設計,欄位不足、工具相容性差。解法:改以 BlogML 匯出/匯入;先小量驗證、檢視日誌。預防:遷移前確認目標工具支援與測試樣本,避免走錯路徑。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q13, C-Q2, A-Q6
D-Q2: 匯入 BlogML 時日期 0000/01/01 例外怎麼辦?
- A簡: 檢查日期解析與時區邏輯,跳過無效值或給預設。
- A詳: 症狀:匯入拋出日期負值例外。原因:無效日期再做時區換算。解法:修改匯入器,若日期為 MinValue/無效則跳過或預設,避免時區轉換;必要時移除時區校正。預防:加入 ASSERT/TRACE 記錄異常列,建立單元測試涵蓋邊界。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q3, C-Q3, B-Q21
D-Q3: 匯入後圖片仍連回舊站怎麼辦?
- A簡: 批次將 WLW 產生的舊域絕對連結改為新站路徑。
- A詳: 症狀:文章圖片為舊站域名。原因:WLW 使用絕對 URL。解法:以 Regex 搜索 http(s)://old 域圖片連結,替換為新域或相對路徑;必要時搬移媒體檔案。預防:未來張貼改用相對路徑策略或啟用上傳服務自動轉換。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q14, C-Q4, B-Q4
D-Q4: 部分文章不見(Article 未匯入)如何解?
- A簡: 擴充匯入器支援 Article 節點,轉為貼文建立。
- A詳: 症狀:匯入後只見部分文章。原因:匯入器僅處理 Blog 節點,忽略 Article。解法:修改匯入器解析 Article,映射欄位建立 Post;或先將 Article 轉 Blog 再匯出。預防:遷移前盤點內容類型,試匯小樣本比對數量。
- 難度: 高級
- 學習階段: 進階
- 關聯概念: B-Q5, C-Q5, A-Q9
D-Q5: 搬家後 PV 大幅下降且 404 變多怎麼辦?
- A簡: 立即實施舊址轉址、修正站內鏈、更新站點地圖。
- A詳: 症狀:PV 大跌、404 日誌暴增。原因:外部連結與索引仍指向舊址。解法:部署舊址相容轉址與提示頁;執行 2 PASS 修正站內鏈;提交新的 Sitemap 並請求重抓。預防:上線前設定轉址、壓測常見路徑、監控告警。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, B-Q8, C-Q10
D-Q6: 安裝 View Count Extension 後不顯示?
- A簡: 確認擴充啟用、模板已引用、權限與儲存位置正確。
- A詳: 症狀:計數不更新或不顯示。原因:未啟用擴充、模板缺少輸出、儲存路徑不可寫。解法:後台啟用擴充;檢視 Post 模板加入顯示欄位;調整 App_Data 權限或 DB 連線。預防:為機器人過濾,避免異常暴增。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: C-Q7, B-Q10, C-Q8
D-Q7: 站內連結錯誤指向舊網址如何修正?
- A簡: 執行 2 PASS:建映射表,再批次替換並更新內容。
- A詳: 症狀:內文互鏈點到舊站。原因:新 URL 未知,轉檔前無法提前替換。解法:PASS1 匯入並記錄映射;PASS2 以 Regex 批次替換舊鏈→新鏈;更新文章。預防:上線前完成 PASS2,驗證隨機抽樣文章。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q6, C-Q6, A-Q13
D-Q8: 舊外部連結失效導到 404 怎麼辦?
- A簡: 建立舊址相容轉址與提示頁,逐步通知外站更新。
- A詳: 症狀:他站連結點入顯示 404。原因:永久連結結構變更。解法:實作舊址解析→新址映射→提示頁轉址;收集轉址來源清單,聯繫重點外站更新。預防:保持舊域一段緩衝期,監控 404 並補特例映射。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, C-Q10, A-Q14
D-Q9: 自訂 Bot Check 遷移卡住怎麼辦?
- A簡: 先採替代方案(審核/頻控),規劃擴充介面再移植。
- A詳: 症狀:原 Bot Check 無法直接移植。原因:擴充點與相依不同。解法:短期改人工審核/節流;中期設計 Extension 介面,漸進導入簡易驗證;長期評估替換方案。預防:自訂功能優先度排序,避免阻塞上線。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q19, B-Q9, A-Q21
D-Q10: Code Formatter 不工作怎麼排查?
- A簡: 檢查標記格式、前端資源載入、事件掛鉤與衝突。
- A詳: 症狀:程式碼無高亮或排版錯亂。原因:標記缺語言屬性、JS/CSS 未載入、渲染時機不對、與其他腳本衝突。解法:檢視輸出 HTML、確認載入 highlight 腳本與 CSS、在 Serving 時機初始化、關閉衝突外掛測試。預防:建立發文規範與主題測試。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q20, A-Q20, C-Q6
學習路徑索引
- 初學者:建議先學習哪 15 題
- A-Q1: 什麼是 CommunityServer 2007?
- A-Q2: 什麼是 BlogEngine.NET?
- A-Q3: 什麼是 BlogML?
- A-Q4: 為什麼從 CommunityServer 遷移到 BlogEngine.NET?
- A-Q5: CommunityServer 與 BlogEngine.NET 的核心差異?
- A-Q6: 為什麼需要使用 BlogML 匯出/匯入?
- A-Q7: 什麼是 ClickOnce 匯入工具?
- A-Q8: Windows Live Writer 絕對網址問題是什麼?
- A-Q10: 為什麼搬家會造成站內與站外連結問題?
- A-Q11: 什麼是 View Count/Counter?為什麼重要?
- A-Q17: 什麼是 Master Page 與 UserControl 架構?
- B-Q4: 絕對連結與相對連結的機制差異?
- B-Q8: 為何 404 會導致 PV 降低?
- C-Q1: 如何用 CommunityServer 2007 匯出 BlogML?
- C-Q2: 如何使用 BlogEngine.NET ClickOnce 匯入 BlogML?
- 中級者:建議學習哪 20 題
- A-Q12: BlogEngine.NET Extension 架構的核心價值?
- A-Q13: 什麼是兩階段匯入(2 PASS)?
- A-Q14: 什麼是舊網址相容轉址?
- A-Q15: 為何時區會導致匯入錯誤?
- A-Q18: 整合 Google Ads 的考量是什麼?
- A-Q22: 為什麼搬家後 Page View 可能下降?
- A-Q23: 為什麼要顯示提示頁而非靜默轉址?
- B-Q1: BlogML 匯出與匯入如何運作?
- B-Q2: BlogEngine.NET 匯入器如何運作?
- B-Q3: 時區與日期解析錯誤背後機制?
- B-Q6: 站內連結修正的兩階段機制?
- B-Q7: 舊網址相容轉址的技術架構?
- B-Q9: BlogEngine.NET Extension 架構如何設計?
- B-Q10: View Count Extension 的運作流程?
- B-Q11: Master Page/UserControl 如何構成版面?
- B-Q12: CSS 調整與廣告版位整合的原理?
- C-Q4: 如何批次修正 WLW 絕對圖片連結?
- C-Q7: 如何在 BlogEngine.NET 安裝 View Count Extension?
- D-Q2: 匯入 BlogML 時日期 0000/01/01 例外怎麼辦?
- D-Q5: 搬家後 PV 大幅下降且 404 變多怎麼辦?
- 高級者:建議關注哪 15 題
- A-Q25: 兩者在可維護性上的比較?
- B-Q5: CommunityServer 的 Article 與 Blog 結構差異如何影響匯入?
- B-Q13: RSS 匯入與 BlogML 匯入的差異與限制?
- B-Q15: 內文搜尋替換(Regex)如何實現連結更新?
- B-Q18: 日誌與錯誤追蹤如何定位搬家問題?
- B-Q19: 倒數提示頁的使用者體驗設計?
- B-Q20: 與 Blog Server 的 Code Formatter 整合點?
- B-Q21: 文章修改時間欄位與資料模型?
- B-Q22: 轉址安全與避免迴圈的機制?
- B-Q23: 與外部網站連結維護策略?
- B-Q24: 相容舊永久連結(Permalink)策略?
- B-Q25: 程式碼精實性與可修改性的特徵?
- C-Q5: 如何將 CommunityServer 的 Article 匯入為 BlogEngine.NET 文章?
- C-Q6: 如何實作 2 PASS 站內連結修正?
- C-Q10: 如何設計舊網址相容與提示頁轉址?