WCF 實戰中常遇到介面假死、超時不拋出例外、配額超限等疑難雜症。本文歸納三大類典型現象、根因與解決方案。前提:服務端配置 includeExceptionDetailInFaults="true" 以獲取真實錯誤。
WinForm + netTcpBinding / wsHttpBinding(有狀態繫結)。
Close() 未呼叫或拋出例外導致會話殘留,佔用會話槽位。maxConcurrentSessions:預設 10,新請求無限等待。try { client.Close(); } catch { client.Abort(); } 模式。serviceThrottling maxConcurrentSessions。basicHttpBinding(無狀態)規避會話管理複雜度。WinForm + netTcpBinding。
| 超限項目 | 預設值 | 配置節點 | 典型場景 |
|---|---|---|---|
| 訊息大小 | 65,536 bytes | maxReceivedMessageSize | 大檔案、大量資料傳輸 |
| 陣列長度 | 16,384 | maxArrayLength | 大型陣列/集合序列化 |
| 單次讀取位元組 | 4,096 | maxBytesPerRead | 二進位資料流讀取 |
| 字串長度 | 8,192 | maxStringContentLength | 長字串、XML 內容 |
| 名稱表字元數 | 16,384 | maxNameTableCharCount | 大量 XML 元素/屬性名稱 |
| 可序列化項目數 | 65,536 | maxItemsInObjectGraph | 大型物件圖(如 10 行 5 列 DataTable = 50 項) |
binding / readerQuotas / dataContractSerializer 中設定)。Stream)、MTOM 等架構手段,避免單次傳輸過大物件。serviceThrottling 監控並發。UsingPattern 反模式警示)。basicHttpBinding + MTOM 或自訂串流協定。FaultException 內部錯誤碼)便於快速定位。WCF 異常多源於「有狀態繫結的資源管理」與「預設配額過於保守」。建立通道管理規範、依場景調整配額、引入流式傳輸架構,可顯著提升系統穩定性與擴充性。