需求:ASP.NET 自動將特定編碼轉換為漢字輸出,導致預期的編碼格式被破壞。解決方案:在 Render 階段攔截完整 HTML,修正後再寫入 Response。
protected override void Render(HtmlTextWriter writer)
{
// 1. 建立記憶體文字寫入器
using (StringWriter sw = new StringWriter())
using (HtmlTextWriter htmlWriter = new HtmlTextWriter(sw))
{
// 2. 讓基類渲染到我們的 StringWriter
base.Render(htmlWriter);
htmlWriter.Flush();
// 3. 取得完整 HTML 字串
string pageContent = sw.ToString();
// 4. 自訂修正邏輯 (範例:修復被誤解碼的實體)
pageContent = FixEncodingIssues(pageContent);
// 5. 直接寫入 Response,繞過原始 writer
Response.Write(pageContent);
// 注意:此處不再呼叫 base.Render(writer),避免雙重輸出
}
}
private string FixEncodingIssues(string html)
{
// 實際業務邏輯:如將 中 還原為實體字元、修正雙重編碼等
return html.Replace("&#x", ""); // 示例
}
| 場景 | 處理邏輯 |
|---|---|
| 編碼修正 | 實體雙重編碼、Unicode 逸出序列異常 |
| 靜態化生成 | File.WriteAllText("page.html", pageContent) 落地靜態檔 |
| 全站 SEO 注入 | 統一插入 <meta>、Canonical、JSON-LD |
| 敏感詞過濾 | Regex 替換違禁詞為 *** |
| 效能分析注入 | 在 </body> 前插入測試腳本、時間戳 |
| AMP 版本生成 | 依規則轉換標籤、移除禁止元素、輸出 .amp.html |
writer 可能導致 Response.Filter、HttpModule 後續處理失效。Response.Filter = new CustomStream(Response.Filter) 串流層攔截 (不佔記憶體、支援管線)。HttpModule 在 PostRequestHandlerExecute 事件修改 Response。app.Use(async (ctx, next) => { ... })。此技術屬於「核選項」,適用於無法從管線上游解決的特殊編碼/輸出修正需求,常規場景請優先考慮 Filter/Module 方案。