首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Response.Flush() 分批輸出無效?瀏覽器緩衝機制解析

     編輯:程式設計綜合問答

在 ASP.NET (WebHandler) 中使用 Response.Flush() 期望逐行即時輸出,卻發現瀏覽器一次性顯示所有內容。主因在於瀏覽器緩衝與HTTP 壓縮。

常見原因與解法

  1. IE/Edge 緩衝閾值:舊版 IE 需收到 ≥ 256 bytes 才開始渲染。解法:在迴圈前輸出一段隱藏 HTML(如 <div style="display:none"> + 256 字元)或改用現代瀏覽器(Chrome/Firefox/Edge Chromium)。
  2. 伺服器端壓縮 (Dynamic Compression):IIS 預設啟用動態壓縮,會緩衝整個回應再壓縮再傳送。解法:在 web.config 關閉該路徑壓縮:
    <system.webServer>
      <urlCompression doDynamicCompression="false" />
    </system.webServer>
    
  3. ASP.NET 緩衝:確認 Response.BufferOutput = true(預設),並搭配 Response.Flush()。
  4. 反向 Proxy / CDN 緩衝:Nginx/Apache/CDN 可能緩衝回應。Nginx 需設定 proxy_buffering off;。

完整可行範例

public class Responseflush : IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        context.Response.ContentType = "text/html; charset=utf-8";
        context.Response.BufferOutput = true;
        // 觸發瀏覽器開始渲染
        context.Response.Write("<div style='display:none'>" + new string(' ', 300) + "</div>");
        context.Response.Flush();

        for (int i = 0; i < 20; i++) {
            System.Threading.Thread.Sleep(500);
            context.Response.Write("第" + i + "步執行完成!<br/>");
            context.Response.Flush();
        }
    }
    public bool IsReusable { get { return false; } }
}

若仍無效,請檢查 IIS 壓縮設定與瀏覽器開發者工具 Network 面板的 Content-Encoding 與 Transfer-Encoding。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved