以下內容依據文章所述的核心情境(Fiddler 啟用後成為系統 Proxy,導致 Visual Studio 2005 與 TFS 之間的 HTTP 連線被攔截與 401 認證失敗)進行擴展與結構化整理,聚焦於不同面向的可操作解決方案、診斷方法與自動化實務,形成 15 個可教學、可實作、可評估的案例。每個案例皆包含問題、根因、方案與實際成效,並以同一個實務脈絡(VS2005 + TFS + Fiddler)拆分出多個具教學價值的子題。
Case #1: 用 Fiddler Log 快速定位 VS2005 + TFS 連線受阻(HTTP 401)
Problem Statement(問題陳述)
業務場景:開發者在 VS2005 進行 TFS 版本控制操作(Get/Check-in/Work Item 連線)同時,開啟 Fiddler 進行 Web/AJAX 偵錯。此時 VS2005 與 TFS 間的 HTTP 連線停滯不前或報錯,造成工作阻塞。 技術挑戰:VS2005 顯示的錯誤訊息與實際連線問題看似無關,難以第一時間找出問題點。 影響範圍:版本控制、工作項目查詢、建置定義存取全部受影響,團隊交付節奏中斷。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- Fiddler 啟動後把系統(WinINET)Proxy 設為 127.0.0.1:8888,所有 HTTP 流量改經 Fiddler。
- VS2005 Team Explorer 依賴 WinINET 代理設定,請求被改道到 Fiddler。
- 經 Fiddler 轉發時,TFS 端的身分驗證流程(IWA/NTLM/Kerberos)未成功,伺服器回 401。
深層原因:
- 架構層面:單一系統代理設定支配多應用,缺少對特定服務(TFS)的細粒度繞過策略。
- 技術層面:IWA/NTLM 對連線與回應握手敏感;經代理轉發時可能破壞預期流程。
- 流程層面:診斷依賴 VS 的錯誤訊息,未第一時間對照 Proxy/HTTP trace。
Solution Design(解決方案設計)
解決策略:先用 Fiddler Log 驗證 TFS 請求實際遭遇的 HTTP 401,以證實是代理引發的認證失敗;建立 SOP:發生 VS + TFS 錯誤→立刻檢視 Fiddler trace→鎖定 401 與 Host→導向後續修復(如加入 Proxy bypass)。
實施步驟:
- 觀測與過濾
- 實作細節:在 Fiddler 裡以 Host 包含 tfs(或實際 TFS 網域)過濾,檢查 401 回應。
- 所需資源:Fiddler(Classic)
- 預估時間:10 分鐘
- 交叉比對
- 實作細節:比對 VS2005 的錯誤與 Fiddler 上的 401,以確立根因是 Proxy/IWA。
- 所需資源:VS2005 + Team Explorer
- 預估時間:10 分鐘
關鍵程式碼/設定:
// Fiddler 濾鏡範例(UI 操作即可):在左上方 QuickExec 輸入
// host tfs 或使用 Filters 面板勾選 "Show only the following Hosts"
Implementation Example(實作範例)
實際案例:文章情境即為 VS2005 與 TFS 經 Fiddler 後出現 401;VS 錯誤訊息與實情不符。 實作環境:Windows + Fiddler Classic + VS2005 + TFS 實測數據:
- 改善前:TFS 操作大量 401,整體無法進行
- 改善後:鎖定問題為代理導致的認證失敗,能導引正確修復
- 改善幅度:診斷時間由數小時降至 10–20 分鐘
Learning Points(學習要點) 核心知識點:
- WinINET 代理與應用的關係(VS2005 依賴 WinINET)
- IWA/NTLM 401 挑戰-回應握手流程
- 以 Fiddler Log 作為一手診斷依據
技能要求:
- 必備技能:HTTP 基礎、Fiddler 基本操作
- 進階技能:認證握手判讀、問題歸因
延伸思考:
- 其他使用 WinINET 的工具也可能受影響?
- 如何自動偵測 401 與目標 Host 並提示?
Practice Exercise(練習題)
- 基礎練習:用 Fiddler 篩選出所有對 TFS 的請求與 401(30 分鐘)
- 進階練習:重放一次 TFS 根目錄請求並觀察 401→後續挑戰流程(2 小時)
- 專案練習:撰寫一份診斷 SOP(含截圖)供團隊使用(8 小時)
Assessment Criteria(評估標準)
- 功能完整性(40%):是否能可靠重現並辨識 401 根因
- 程式碼品質(30%):N/A(以流程文檔為主)
- 效能優化(20%):診斷時間與準確率
- 創新性(10%):是否提出輔助過濾或自動告警想法
Case #2: 以 Proxy Bypass 讓 TFS 直連,立即恢復工作
Problem Statement(問題陳述)
業務場景:需要同時使用 Fiddler 偵錯 Web,但又不希望影響 VS2005 與 TFS 的連線。 技術挑戰:如何在 Fiddler 改寫系統 Proxy 後,讓 TFS 成為例外不經 Fiddler? 影響範圍:若無法繞過,TFS 操作中斷,影響產出。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- 系統 Proxy 被設為 127.0.0.1:8888。
- VS2005 使用該 Proxy 連 TFS。
- 代理路徑破壞 IWA/NTLM 流程。
深層原因:
- 架構層面:缺乏服務例外機制。
- 技術層面:IWA 對代理敏感。
- 流程層面:未預先建置 bypass 白名單。
Solution Design(解決方案設計)
解決策略:在 WinINET 的 Proxy 例外(ProxyOverride)加入 TFS 主機或網域,讓 TFS 直連不經 Fiddler。
實施步驟:
- 手動設定例外
- 實作細節:控制台 → Internet Options → Connections → LAN Settings → Advanced → Exceptions
- 所需資源:Windows、權限
- 預估時間:5–10 分鐘
- 驗證
- 實作細節:重新嘗試 VS2005 連 TFS,觀察是否恢復
- 所需資源:VS2005 + TFS
- 預估時間:5 分鐘
關鍵程式碼/設定:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyOverride"="tfsserver;*.tfs.local;<local>"
Implementation Example(實作範例):將 TFS 主機(或網域)加入 ProxyOverride
實際案例:文章作者在 Fiddler 自動設定完成後,將 TFS 網址加到 bypass list 後一切正常。 實作環境:Windows + Fiddler + VS2005 + TFS 實測數據:
- 改善前:TFS 作業失敗(401 / 停滯)
- 改善後:TFS 作業恢復正常
- 改善幅度:可用性由 0% → 100%
Learning Points(學習要點) 核心知識點:
- WinINET ProxyOverride 語法與應用
-
範圍涵義 - Bypass 的風險與邊界
技能要求:
- 必備技能:Windows 網路設定
- 進階技能:域名規劃與例外策略
延伸思考:
- 多個 TFS 節點如何維護?
- 若企業必須經公司 Proxy,如何兼顧?
Practice Exercise(練習題)
- 基礎:手動加入單一主機例外(30 分鐘)
- 進階:加入多主機與萬用字元例外並驗證(2 小時)
- 專案:撰寫團隊標準例外清單文件(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:能成功直連 TFS
- 程式碼品質:N/A(設定為主)
- 效能優化:切換與驗證效率
- 創新性:例外清單設計合理性
Case #3: 用 FiddlerScript OnAttach 自動加入 TFS 例外
Problem Statement(問題陳述)
業務場景:每次開啟 Fiddler 都要手動加入 TFS 例外,繁瑣又易忘。 技術挑戰:如何在 Fiddler Attach(設定系統 Proxy)時自動把 TFS 加入 ProxyOverride? 影響範圍:提升開發流暢度,降低出錯機率。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- Fiddler 預設會改寫 Proxy,但不會自動加自訂例外。
- 手動流程易忘或誤填。
- 每位開發者各自為政,難以統一。
深層原因:
- 架構層面:工具缺乏團隊化自動治理。
- 技術層面:需在 FiddlerScript 中操控註冊表。
- 流程層面:缺少通用化腳本與維護機制。
Solution Design(解決方案設計)
解決策略:在 Fiddler 的 OnAttach 事件中以 JScript.NET 改寫 HKCU 的 ProxyOverride,將 TFS 主機加入;必要時記錄 Log 以利審閱。
實施步驟:
- 客製 Rules
- 實作細節:Rules → Customize Rules,實作 OnAttach
- 所需資源:FiddlerScript(JScript.NET)
- 預估時間:1 小時
- 測試與回滾
- 實作細節:加入、關閉再開、驗證 ProxyOverride 是否持久;保留備份值
- 所需資源:Windows Registry
- 預估時間:30 分鐘
關鍵程式碼/設定:
// FiddlerScript(JScript.NET),在 OnAttach 中追加例外
import Microsoft.Win32;
static function OnAttach() {
var keyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
var rk = Registry.CurrentUser.OpenSubKey(keyPath, true);
var current = "" + rk.GetValue("ProxyOverride", "");
var toAdd : String[] = { "tfsserver", "*.tfs.local", "<local>" };
for (var i:int=0; i<toAdd.Length; i++) {
if (current.IndexOf(toAdd[i]) < 0) {
current = (current.Length > 0) ? (current + ";" + toAdd[i]) : toAdd[i];
}
}
rk.SetValue("ProxyOverride", current, Microsoft.Win32.RegistryValueKind.String);
FiddlerObject.log("ProxyOverride updated: " + current);
}
// 注意:修改系統設定需審慎測試;可另實作 OnDetach 做回復(見 Case #4)
Implementation Example(實作範例)
實際案例:文章作者計畫在 OnAttach 中自動修改 Proxy 設定加入 bypass。 實作環境:Fiddler Classic + JScript.NET 實測數據:
- 改善前:每次需手動維護例外
- 改善後:自動化,遺漏率趨近 0
- 改善幅度:作業時間降 90% 以上
Learning Points(學習要點) 核心知識點:
- FiddlerScript 事件生命週期(OnAttach/OnDetach)
- Registry 操作安全性
- 例外清單去重策略
技能要求:
- 必備技能:JScript.NET/Registry
- 進階技能:工具治理與團隊化部署
延伸思考:
- 是否需做白名單集中配置?
- 如何稽核誰改了規則?
Practice Exercise(練習題)
- 基礎:實作 OnAttach 追加單一主機(30 分鐘)
- 進階:加入多主機去重與日誌(2 小時)
- 專案:封裝並版本控管 Rules(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:OnAttach 是否穩定生效
- 程式碼品質:註解、去重、容錯
- 效能優化:最小化對系統的影響
- 創新性:可移植、可維運
Case #4: 儲存與還原原始 Proxy 設定,避免環境殘留
Problem Statement(問題陳述)
業務場景:Fiddler 關閉或異常後,系統 Proxy 可能殘留,影響其他應用。 技術挑戰:如何在 Attach 時保存現狀,Detach 或關閉時還原? 影響範圍:保護整體開發環境穩定。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- Fiddler 改寫 ProxyEnable/ProxyServer/ProxyOverride。
- 關閉/當機未必還原。
- 使用者不記得原設定。
深層原因:
- 架構層面:缺還原機制。
- 技術層面:需可靠存放備份值。
- 流程層面:缺 SOP。
Solution Design(解決方案設計)
解決策略:OnAttach 時快照三值(ProxyEnable/ProxyServer/ProxyOverride)至檔案;OnDetach 優先還原;異常時提供外部修復工具。
實施步驟:
- 快照與持久化
- 實作細節:寫入 %LOCALAPPDATA%\FiddlerProxyBackup.json
- 所需資源:FiddlerScript
- 預估時間:1 小時
- 還原與驗證
- 實作細節:OnDetach 還原並通知變更
- 所需資源:Registry、通知
- 預估時間:1 小時
關鍵程式碼/設定:
// JScript.NET 片段:保存與還原(要點示意)
import Microsoft.Win32;
import System.IO;
static var backupPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\FiddlerProxyBackup.txt";
static function SaveProxySnapshot() {
var rk = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
var snapshot = rk.GetValue("ProxyEnable",0) + "|" + rk.GetValue("ProxyServer","") + "|" + rk.GetValue("ProxyOverride","");
File.WriteAllText(backupPath, snapshot);
}
static function RestoreProxySnapshot() {
if (!File.Exists(backupPath)) return;
var parts = File.ReadAllText(backupPath).Split("|".ToCharArray());
var rk = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
rk.SetValue("ProxyEnable", Int32.Parse(parts[0]), Microsoft.Win32.RegistryValueKind.DWord);
rk.SetValue("ProxyServer", parts[1], Microsoft.Win32.RegistryValueKind.String);
rk.SetValue("ProxyOverride", parts[2], Microsoft.Win32.RegistryValueKind.String);
}
static function OnAttach() { SaveProxySnapshot(); /*...*/ }
static function OnDetach() { RestoreProxySnapshot(); }
Implementation Example(實作範例)
實際案例:呼應作者的計畫第(1)步「存下目前的 Proxy Config」。 實作環境:Fiddler Classic + JScript.NET 實測數據:
- 改善前:偶有殘留,影響工作
- 改善後:還原成功率 100%
- 改善幅度:故障復原時間由 10+ 分鐘降至 <1 分鐘
Learning Points(學習要點) 核心知識點:
- Proxy 相關註冊表鍵位
- 還原機制與異常保護
- 變更通知(Case #10)
技能要求:
- 必備技能:檔案 I/O、Registry
- 進階技能:例外處理
延伸思考:
- 是否需多使用者/多工作站同步?
- 要不要做數位簽章保護備份檔?
Practice Exercise(練習題)
- 基礎:快照與還原一次(30 分鐘)
- 進階:加入錯誤處理與日誌(2 小時)
- 專案:封裝成可執行工具(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:完整保存/還原
- 程式碼品質:結構、註解、錯誤處理
- 效能優化:IO 次數與可靠性
- 創新性:恢復策略設計
Case #5: 維護多個 TFS 端點的 Proxy 例外(含萬用字元)
Problem Statement(問題陳述)
業務場景:組織有多個 TFS 主機或多環境(Dev/UAT/Prod),每次手動維護耗時。 技術挑戰:避免重複與遺漏,使用萬用字元擴大覆蓋。 影響範圍:提高維運一致性。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- 多端點、易遺漏。
- 例外字串易重複、污染。
- 手動同步困難。
深層原因:
- 架構層面:無集中管理例外。
- 技術層面:不了解 ProxyOverride 語法特性。
- 流程層面:缺乏標準清單。
Solution Design(解決方案設計)
解決策略:以腳本合併例外清單,使用萬用字元(如 *.tfs.local),並自動去重、排序。
實施步驟:
- 撰寫合併腳本
- 實作細節:PowerShell 合併現有 + 新清單,Select-Object -Unique
- 所需資源:Windows PowerShell
- 預估時間:1 小時
- 發佈與驗證
- 實作細節:套用於多台機器,檢查 ProxyOverride
- 所需資源:PSRemoting(選)
- 預估時間:1–2 小時
關鍵程式碼/設定:
$path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
$desired = @('tfsserver','*.tfs.local','<local>')
$current = (Get-ItemProperty -Path $path -Name ProxyOverride -ErrorAction SilentlyContinue).ProxyOverride
$merged = @($current -split ';', $desired) | Where-Object { $_ -and $_.Trim() -ne '' } | Select-Object -Unique
$new = ($merged -join ';')
Set-ItemProperty -Path $path -Name ProxyOverride -Value $new
Write-Host "ProxyOverride => $new"
Implementation Example(實作範例)
實際案例:將 TFS 網址與網域一次性納入。 實作環境:Windows + PowerShell 實測數據:
- 改善前:人為遺漏率 > 20%
- 改善後:遺漏率 ~ 0%,維護時間降 80%
- 改善幅度:一致性顯著提升
Learning Points(學習要點) 核心知識點:
- ProxyOverride 合併與去重
- 萬用字元覆蓋策略
- 腳本化部署
技能要求:
- 必備技能:PowerShell
- 進階技能:端點清單治理
延伸思考:
- 是否需集中在 Git 管理清單?
- 如何自動從 AD/DNS 匯出端點名單?
Practice Exercise(練習題)
- 基礎:用 PS 加入兩個端點例外(30 分鐘)
- 進階:加入萬用字元與排序(2 小時)
- 專案:建立團隊例外清單管理流程(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:端點例外正確生效
- 程式碼品質:可讀性與錯誤處理
- 效能優化:批量更新效率
- 創新性:合併策略設計
Case #6: ProxyOverride 語法與陷阱校正(分號/萬用字元/)
Problem Statement(問題陳述)
業務場景:加入例外後仍無效,原因多為字串語法錯誤。
技術挑戰:熟悉語法:分號分隔、萬用字元、
Root Cause Analysis(根因分析)
直接原因:
- 少分號或多空白。
- 萬用字元位置錯。
- 忘記
。 **深層原因**: - 架構層面:設定非結構化字串。
- 技術層面:語法記憶錯誤。
- 流程層面:缺少檢核清單。
Solution Design(解決方案設計)
解決策略:建立語法檢核與範本,統一風格與示例。
實施步驟:
- 標準化
- 實作細節:提供規範字串模板與檢查清單
- 所需資源:團隊 wiki
- 預估時間:30 分鐘
- 驗證
- 實作細節:實際測試是否直連
- 所需資源:VS2005 + TFS
- 預估時間:15 分鐘
關鍵程式碼/設定:
正確範例:
- "tfsserver;*.tfs.local;<local>"
- "*.corp.local;intranet;10.*;192.168.*;<local>"
錯誤常見:
- "tfsserver *.tfs.local"(缺分號)
- "*.tfs.local; ;"(多空白與空條目)
Implementation Example(實作範例)
實際案例:修正語法後,TFS 直連成功。 實作環境:Windows + IE/WinINET 實測數據:
- 改善前:設定看似存在但無效
- 改善後:生效率 100%
- 改善幅度:避免錯誤配置造成的反覆嘗試
Learning Points(學習要點) 核心知識點:
- ProxyOverride 字串規則
-
的涵義(無點主機名直連) - 測試方法
技能要求:
- 必備技能:基礎網路設定
- 進階技能:無
延伸思考:
- 是否需工具自動檢核字串?
- 例外與 PAC 的取捨?
Practice Exercise(練習題)
- 基礎:從錯誤字串修正為可用字串(30 分鐘)
- 進階:加入內網位址與網域覆蓋(2 小時)
- 專案:撰寫靜態檢核腳本(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:語法正確且生效
- 程式碼品質:檢核腳本(如有)
- 效能優化:N/A
- 創新性:校正工具設計
Case #7: 用重放與對照驗證 401 → 200 的修復成效
Problem Statement(問題陳述)
業務場景:修正後需要確認 TFS 認證與操作已恢復。 技術挑戰:如何以客觀方式驗證? 影響範圍:避免「以為修好」的風險。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- 修復前 401。
- 修復後應見到 200/302 等正常流程。
- 需要可重現的驗證步驟。
深層原因:
- 架構層面:無驗證腳本。
- 技術層面:不了解 TFS 服務端點回應特徵。
- 流程層面:缺標準驗證清單。
Solution Design(解決方案設計)
解決策略:透過 Fiddler Composer 或 VS 基本操作(例如:連線 TFS、瀏覽專案)前後對照 401/200;建立驗收清單。
實施步驟:
- 建立驗收清單
- 實作細節:能連線集合、列出專案、讀取版本清單
- 所需資源:VS2005 Team Explorer
- 預估時間:30 分鐘
- Log 對照
- 實作細節:Fiddler 中搜尋 401 是否消失
- 所需資源:Fiddler
- 預估時間:15 分鐘
關鍵程式碼/設定:
// Fiddler Composer:對 TFS 服務 URL 發 GET,觀察回應碼由 401→200
// VS 操作:Team Explorer 連線、展開專案、Get Latest Version
Implementation Example(實作範例)
實作環境:Fiddler + VS2005 + TFS 實測數據:
- 改善前:401/停滯
- 改善後:200/正常列表
- 改善幅度:成功率 0%→100%
Learning Points(學習要點) 核心知識點:
- 驗收清單的重要性
- Fiddler Composer 的運用
- 以 HTTP Code 為客觀依據
技能要求:
- 必備技能:Fiddler 操作
- 進階技能:N/A
延伸思考:
- 能否以自動化測試監測此連通性?
- 將驗收清單納入 CI 健康檢查?
Practice Exercise(練習題)
- 基礎:手動驗證 401 消失(30 分鐘)
- 進階:建立小型自動化 ping(2 小時)
- 專案:把驗證清單寫成指導文件(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:驗證步驟完備
- 程式碼品質:自動化腳本(如有)
- 效能優化:N/A
- 創新性:驗證自動化程度
Case #8: 一鍵切換 Proxy 例外的外部小工具
Problem Statement(問題陳述)
業務場景:不想修改 FiddlerScript 或權限不足時,需用外部工具快速切換 TFS 例外。 技術挑戰:在不關閉 Fiddler 的情況下完成調整。 影響範圍:提升可用性與跨團隊推廣。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- 手動步驟繁瑣。
- 規則不可攜或權限受限。
- 需要一鍵工具。
深層原因:
- 架構層面:設定無自動化。
- 技術層面:需通知 WinINET 設定變更。
- 流程層面:缺工具化 SOP。
Solution Design(解決方案設計)
解決策略:以 C#/PowerShell 寫一鍵工具合併/移除例外並呼叫 InternetSetOption 通知系統。
實施步驟:
- 腳本/程式設計
- 實作細節:增刪 ProxyOverride;觸發設定變更
- 所需資源:.NET/PowerShell
- 預估時間:1–2 小時
- 發佈
- 實作細節:提供二進位/腳本與使用說明
- 所需資源:文件/簽章(選)
- 預估時間:1 小時
關鍵程式碼/設定:
// C#:更新 ProxyOverride 並通知 WinINET
using Microsoft.Win32;
using System;
using System.Runtime.InteropServices;
class ProxyBypassToggle {
[DllImport("wininet.dll", SetLastError=true)]
static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
const int INTERNET_OPTION_REFRESH = 37;
static void Main() {
var path = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
using (var rk = Registry.CurrentUser.OpenSubKey(path, writable:true)) {
var current = (rk.GetValue("ProxyOverride","") as string) ?? "";
var add = new [] { "tfsserver", "*.tfs.local", "<local>" };
foreach (var s in add) if (!current.Contains(s)) current = (current.Length>0)? current+";"+s : s;
rk.SetValue("ProxyOverride", current);
}
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
Console.WriteLine("ProxyOverride updated.");
}
}
Implementation Example(實作範例)
實作環境:Windows + .NET Framework 實測數據:
- 改善前:切換需 1–2 分鐘
- 改善後:一鍵 < 1 秒
- 改善幅度:效率提升 95%+
Learning Points(學習要點) 核心知識點:
- WinINET 設定變更通知
- 註冊表寫入與保護
- 工具化與可攜性
技能要求:
- 必備技能:C#/PowerShell
- 進階技能:部署與簽章
延伸思考:
- 是否加入 GUI 與狀態檢視?
- 加入回復按鈕(參 Case #4)
Practice Exercise(練習題)
- 基礎:編譯執行工具並驗證(30 分鐘)
- 進階:加入刪除例外選項(2 小時)
- 專案:做成托盤常駐程式(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:增刪與通知皆可用
- 程式碼品質:結構與容錯
- 效能優化:即時生效
- 創新性:UI/UX 設計
Case #9: Fiddler 崩潰或異常關閉後的 Proxy 殘留修復
Problem Statement(問題陳述)
業務場景:Fiddler 異常結束,留下 ProxyEnable=1/ProxyServer=127.0.0.1:8888,導致所有應用無法上網或連 TFS。 技術挑戰:如何快速偵測並一鍵修復? 影響範圍:整機網路可用性。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- 異常退出未觸發還原。
- 使用者不知如何手動修復。
- 環境依賴 WinINET。
深層原因:
- 架構層面:缺失效保護。
- 技術層面:未設置看門狗。
- 流程層面:無快修 SOP。
Solution Design(解決方案設計)
解決策略:提供緊急修復批次/PS 腳本,將 ProxyEnable=0 並清空 ProxyServer/ProxyOverride(或還原快照)。
實施步驟:
- 快修腳本
- 實作細節:reg add/PowerShell 設定
- 所需資源:腳本執行權限
- 預估時間:30 分鐘
- 發佈與教育
- 實作細節:放在桌面或內網知識庫
- 所需資源:文件
- 預估時間:30 分鐘
關鍵程式碼/設定:
:: 修復 WinINET 代理殘留(Batch)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "" /f
:: ProxyOverride 可視情況保留或清空
echo Fixed WinINET proxy.
Implementation Example(實作範例)
實作環境:Windows 實測數據:
- 改善前:無法連網/無法連 TFS
- 改善後:立即恢復
- 改善幅度:停工時間減少 90%+
Learning Points(學習要點) 核心知識點:
- ProxyEnable/ProxyServer 鍵值
- 緊急修復流程
- 風險:清空值前先備份
技能要求:
- 必備技能:批次/PS 基礎
- 進階技能:自動偵測殘留
延伸思考:
- 加入看門狗常駐程式自動修復?
- 失敗重試策略?
Practice Exercise(練習題)
- 基礎:執行快修腳本(30 分鐘)
- 進階:加入偵測再修復(2 小時)
- 專案:做成小工具(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:能復原網路
- 程式碼品質:安全/備份
- 效能優化:一鍵完成
- 創新性:自動化程度
Case #10: 變更 Proxy 後正確通知系統(InternetSetOption)
Problem Statement(問題陳述)
業務場景:程式化修改 ProxyOverride 後,有些應用未即時生效。 技術挑戰:如何觸發 WinINET 即時套用? 影響範圍:降低誤判與等待。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- 僅寫入註冊表,未通知系統。
- 應用緩存舊值。
- 未刷新設定。
深層原因:
- 架構層面:缺少設定變更訊號。
- 技術層面:不了解 WinINET 選項。
- 流程層面:未納入 SOP。
Solution Design(解決方案設計)
解決策略:程式中呼叫 wininet.dll 的 InternetSetOption,傳遞 SETTINGS_CHANGED 與 REFRESH。
實施步驟:
- 加入通知
- 實作細節:C# P/Invoke
- 所需資源:.NET
- 預估時間:30 分鐘
- 驗證
- 實作細節:修改後立即驗證生效
- 所需資源:VS2005 + TFS
- 預估時間:15 分鐘
關鍵程式碼/設定:
[DllImport("wininet.dll", SetLastError=true)]
static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
const int INTERNET_OPTION_REFRESH = 37;
// 修改註冊表後:
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
Implementation Example(實作範例)
實作環境:Windows + .NET 實測數據:
- 改善前:需重開應用或等待
- 改善後:即時生效
- 改善幅度:等待成本 ~0
Learning Points(學習要點) 核心知識點:
- WinINET 通知模型
- 設定熱更新
- 避免不必要重啟
技能要求:
- 必備技能:C# P/Invoke
- 進階技能:系統 API 使用
延伸思考:
- 是否需要廣播 WM_SETTINGCHANGE?
- 舊應用緩存策略處理?
Practice Exercise(練習題)
- 基礎:在現有工具中加入通知(30 分鐘)
- 進階:加入錯誤處理/重試(2 小時)
- 專案:封裝為公用函式庫(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:變更即時生效
- 程式碼品質:P/Invoke 正確性
- 效能優化:零等待
- 創新性:通用封裝
Case #11: 面對 VS2005 誤導性錯誤訊息的診斷 SOP
Problem Statement(問題陳述)
業務場景:VS2005 顯示與 Proxy/IWA 無關的錯誤訊息,導致開發者方向錯誤。 技術挑戰:建立一致 SOP,避免誤診。 影響範圍:縮短修復時間。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- VS 錯誤訊息不直指 401/代理問題。
- 開發者忽略 Fiddler Log。
- 缺少明確的排查順序。
深層原因:
- 架構層面:工具間缺少聯動提示。
- 技術層面:HTTP/代理知識不足。
- 流程層面:無標準排查路徑。
Solution Design(解決方案設計)
解決策略:制定 SOP:一旦 TFS 操作失敗→檢查 Fiddler 是否開啟→過濾 TFS Host→查 401→採取 bypass 或關閉 Fiddler/恢復 Proxy。
實施步驟:
- SOP 文件
- 實作細節:圖文流程,放知識庫
- 所需資源:Wiki
- 預估時間:1 小時
- 教育與演練
- 實作細節:短訓/示範
- 所需資源:內訓
- 預估時間:1 小時
關鍵程式碼/設定:
SOP 精要:
- 步驟1:確認 Fiddler 是否 Attach(是否設 Proxy)
- 步驟2:Fiddler 篩 TFS Host 是否 401
- 步驟3:若是→執行 ProxyOverride bypass(Case #2/#3)
- 步驟4:重試 VS 操作並記錄
Implementation Example(實作範例)
實作環境:團隊知識庫 實測數據:
- 改善前:平均定位 > 30 分鐘
- 改善後:平均定位 < 10 分鐘
- 改善幅度:效率提升 ~66%
Learning Points(學習要點) 核心知識點:
- 代理影響鏈
- 診斷順序
- 反覆演練重要性
技能要求:
- 必備技能:文件撰寫
- 進階技能:內訓設計
延伸思考:
- 可否做成 IDE 擴充提示?
- 用腳本自動檢測並彈窗?
Practice Exercise(練習題)
- 基礎:撰寫個人 SOP(30 分鐘)
- 進階:情境模擬排查(2 小時)
- 專案:團隊內訓教材(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:SOP 涵蓋主要分支
- 程式碼品質:N/A
- 效能優化:縮短平均修復時間
- 創新性:可操作性與工具化
Case #12: 限縮 Fiddler 擷取範圍,避免干擾 TFS 流量
Problem Statement(問題陳述)
業務場景:希望保持 Fiddler 開啟以偵錯 Web,但不想讓 TFS 流量被 Fiddler 影響或噪音污染。 技術挑戰:如何在 Fiddler 規則層面忽略 TFS 相關請求,以減少干擾? 影響範圍:降低誤判與工作干擾。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- TFS 請求被擷取造成視覺噪音或分析負擔。
- 有時即便已 bypass,仍會看到殘餘請求或非預期流量。
- 無忽略規則。
深層原因:
- 架構層面:未分流不同業務流量。
- 技術層面:未善用 oSession.Ignore。
- 流程層面:缺少擷取策略。
Solution Design(解決方案設計)
解決策略:在 Rules 中忽略 TFS Host 的請求,避免被列入或被誤處理(注意:此法不等同直連,仍須搭配 Proxy bypass 才能解決 401 問題)。
實施步驟:
- 客製忽略規則
- 實作細節:Rules → Customize Rules → OnBeforeRequest
- 所需資源:FiddlerScript
- 預估時間:30 分鐘
- 測試
- 實作細節:確認清單不再出現 TFS 請求
- 所需資源:Fiddler
- 預估時間:10 分鐘
關鍵程式碼/設定:
// 在 OnBeforeRequest 中忽略 TFS 目標(僅減少擷取干擾,非繞過代理)
if (oSession.HostnameIs("tfsserver") || oSession.HostnameIs("tfsserver.company.local")) {
oSession.Ignore(); // 不顯示在列表
}
Implementation Example(實作範例)
實作環境:Fiddler Classic + JScript.NET 實測數據:
- 改善前:Fiddler 視窗被 TFS 請求塞滿
- 改善後:只見與 Web 偵錯相關請求
- 改善幅度:分析效率提升
Learning Points(學習要點) 核心知識點:
- oSession.Ignore 的用途與限制
- 擷取策略與生產力的關係
- 仍需搭配 Proxy bypass 解決 401
技能要求:
- 必備技能:FiddlerScript
- 進階技能:規則治理
延伸思考:
- 根據標頭/路徑更精細忽略
- 以 Profiles 切換擷取配置
Practice Exercise(練習題)
- 基礎:忽略單一主機(30 分鐘)
- 進階:依路徑/標頭忽略(2 小時)
- 專案:建立擷取 Profile(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:忽略規則正確生效
- 程式碼品質:規則清晰
- 效能優化:視覺噪音降低
- 創新性:Profile 設計
Case #13: 建立團隊共用的 Fiddler + TFS 使用準則(Playbook)
Problem Statement(問題陳述)
業務場景:團隊多數人會同時用 Fiddler 與 TFS,常重複踩雷。 技術挑戰:缺乏統一指引,導致個別處置不一致。 影響範圍:整體效率與穩定性。 複雜度評級:低
Root Cause Analysis(根因分析)
直接原因:
- 沒有標準化教戰手冊。
- 每個人都用不同方法繞過。
- 新人學習成本高。
深層原因:
- 架構層面:知識未制度化。
- 技術層面:實作分散。
- 流程層面:缺乏維護人。
Solution Design(解決方案設計)
解決策略:制定 Playbook,涵蓋:診斷、bypass 設定、腳本工具、還原、常見錯誤、驗證清單;集中維護於版本庫。
實施步驟:
- 撰寫與審閱
- 實作細節:整合 Case #1–#12 的精要
- 所需資源:Wiki/Git
- 預估時間:4–8 小時
- 落地與回饋
- 實作細節:導入團隊、收集問題迭代
- 所需資源:例行檢討
- 預估時間:持續
關鍵程式碼/設定:
Playbook 章節建議:
- 問題徵象與快速檢查
- ProxyOverride 樣板與腳本
- FiddlerScript 樣板(OnAttach/OnDetach)
- 快速修復工具(Batch/PowerShell/C#)
- 驗證清單與常見陷阱
Implementation Example(實作範例)
實作環境:知識庫 + 版本庫 實測數據:
- 改善前:重複性問題頻發
- 改善後:平均修復時間下降 50%+
- 改善幅度:生產力提升
Learning Points(學習要點) 核心知識點:
- 團隊標準化
- 文件版本控管
- 持續改進
技能要求:
- 必備技能:文件化與教學設計
- 進階技能:治理與維運
延伸思考:
- 加入 FAQ 與決策樹
- 將腳本封裝成 NuGet/工具箱
Practice Exercise(練習題)
- 基礎:整理個人操作筆記成章節(30 分鐘)
- 進階:與同事互審改進(2 小時)
- 專案:完成 v1.0 Playbook(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:內容覆蓋全面
- 程式碼品質:範例可用
- 效能優化:縮短平均故障時間
- 創新性:易用性與可維護性
Case #14: 降低風險的安全邊界設定(僅對內網 TFS 做直連)
Problem Statement(問題陳述)
業務場景:為了修復問題加入 bypass,但需顧及安全邊界。 技術挑戰:如何限制只針對內部 TFS 主機直連,避免影響外部流量策略? 影響範圍:安全與合規。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- 過度寬鬆的萬用字元例外。
- 忽略外部站台走公司 Proxy 的政策。
- 安全審計要求明確邊界。
深層原因:
- 架構層面:缺少 allowlist 思維。
- 技術層面:例外設置不精確。
- 流程層面:未與資安對齊。
Solution Design(解決方案設計)
解決策略:以明確的 TFS 內網域名為 allowlist(如 *.tfs.local),避免對外域名直連;對外仍走原 Proxy 策略。
實施步驟:
- 確認內外域名
- 實作細節:與網管/資安確認 TFS FQDN 範圍
- 所需資源:域名規劃文件
- 預估時間:1 小時
- 調整例外清單
- 實作細節:縮窄萬用字元範圍
- 所需資源:Case #5 腳本
- 預估時間:30 分鐘
關鍵程式碼/設定:
"ProxyOverride"="tfsserver;*.tfs.local;<local>" ; // 僅內網 TFS
Implementation Example(實作範例)
實作環境:Windows + 資安政策 實測數據:
- 改善前:例外過廣,可能繞過外部管理代理
- 改善後:例外精準,風險降低
- 改善幅度:合規性提升
Learning Points(學習要點) 核心知識點:
- Allowlist 思維
- 例外與安全的平衡
- 與資安協作
技能要求:
- 必備技能:網域與代理策略理解
- 進階技能:合規對齊
延伸思考:
- 是否轉為 PAC 檔集中治理?
- 例外清單的存取控制?
Practice Exercise(練習題)
- 基礎:縮窄既有例外(30 分鐘)
- 進階:撰寫 allowlist 準則(2 小時)
- 專案:與資安共同審視(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:直連僅限內網 TFS
- 程式碼品質:設定清晰
- 效能優化:N/A
- 創新性:治理機制設計
Case #15: 將整體方案量化與監測(前後成效指標)
Problem Statement(問題陳述)
業務場景:導入 bypass 與自動化後,需要持續追蹤成效與回饋。 技術挑戰:建立可量化指標與監測方式。 影響範圍:持續改善與治理。 複雜度評級:中
Root Cause Analysis(根因分析)
直接原因:
- 無數據難以證明成效。
- 問題偶發,需長期監測。
- 團隊回饋零散。
深層原因:
- 架構層面:缺監控面板。
- 技術層面:未蒐集事件。
- 流程層面:無回饋循環。
Solution Design(解決方案設計)
解決策略:收集 TFS 連線失敗比率、修復平均時間(MTTR)、Fiddler 在場時的 401 發生率,形成周報面板,輔以問卷回饋。
實施步驟:
- 指標定義
- 實作細節:401 比率、MTTR、SOP 覆蓋率
- 所需資源:簡易表單/腳本
- 預估時間:1 小時
- 蒐集與可視化
- 實作細節:用 Excel/SharePoint/簡易 dashboard
- 所需資源:團隊工具
- 預估時間:2–4 小時
關鍵程式碼/設定:
度量建議:
- 改善前:TFS 連線成功率(Fiddler 開啟時) < 10%
- 改善後:> 95%
- MTTR:由 >30 分鐘 降到 <10 分鐘
Implementation Example(實作範例)
實作環境:團隊協作平台 實測數據:
- 改善前:成功率低、定位慢
- 改善後:成功率高、定位快
- 改善幅度:顯著提升
Learning Points(學習要點) 核心知識點:
- 指標化與可視化
- 資料驅動改善
- 回饋循環
技能要求:
- 必備技能:資料整理
- 進階技能:儀表板設計
延伸思考:
- 自動蒐集 Fiddler/VS 事件?
- 導入 A/B 對照不同策略?
Practice Exercise(練習題)
- 基礎:定義 3 個關鍵指標(30 分鐘)
- 進階:建立周報儀表板(2 小時)
- 專案:導入月度回顧流程(8 小時)
Assessment Criteria(評估標準)
- 功能完整性:指標可計量
- 程式碼品質:N/A
- 效能優化:資料蒐集成本
- 創新性:可視化設計
案例分類
1) 按難度分類
- 入門級(適合初學者)
- Case 2, 6, 7, 9, 10, 11, 12
- 中級(需要一定基礎)
- Case 1, 3, 4, 5, 8, 14, 15
- 高級(需要深厚經驗)
- 本篇設計聚焦操作與治理,未涉及高難度協議堆疊改造,如需高級可延伸至「讓 IWA 穿越代理的深入實作與測試」
2) 按技術領域分類
- 架構設計類
- Case 13, 14, 15
- 效能優化類
- Case 7, 12
- 整合開發類
- Case 3, 4, 5, 8, 10
- 除錯診斷類
- Case 1, 6, 9, 11
- 安全防護類
- Case 14
3) 按學習目標分類
- 概念理解型
- Case 1, 6, 11, 14
- 技能練習型
- Case 2, 3, 4, 5, 8, 9, 10, 12
- 问题解决型
- Case 2, 3, 4, 5, 7, 9
- 創新應用型
- Case 13, 15
案例關聯圖(學習路徑建議)
- 建議先學:
- Case 1(用 Fiddler Log 辨識 401 根因)→ 奠定問題辨識能力
- Case 2(手動 Proxy bypass)→ 立即解痛、建立正確心智模型
- Case 6(ProxyOverride 語法)→ 確保設定正確
- 依賴關係:
- Case 3(OnAttach 自動化)依賴 Case 2/6 的正確範式
- Case 4(保存/還原)與 Case 3 並行,提升穩定性
- Case 5(多端點治理)依賴 Case 2/3 的例外機制
- Case 10(設定變更通知)是 Case 3/5/8 的共用底層能力
- Case 7(修復驗證)串接在任一修復方案之後
- Case 8(外部工具)可取代或輔助 Case 3
- Case 9(殘留修復)作為所有方案的保險與回退
- Case 12(限縮擷取)提升 Case 1–3 的使用體驗
- Case 13(Playbook)匯總前述所有作法
- Case 14(安全邊界)對 Case 2/3/5 的策略收斂
- Case 15(量化監測)驗證整體治理有效性
- 完整學習路徑建議: 1) 問題辨識與立即修復:Case 1 → Case 2 → Case 6 → Case 7 2) 自動化與穩定性:Case 3 → Case 4 → Case 10 → Case 5 → Case 8 → Case 9 3) 體驗與治理:Case 12 → Case 13 → Case 14 → Case 15
此路徑能從單點故障排除,逐步升級到自動化、團隊治理與效益量化,完整覆蓋文章所述情境中的關鍵問題、根因、解法與實際成效。