2013-08-20 26 views
1

我通過在頁面中間呼叫Response.Flush()將頁面發送給客戶端。這是瀏覽器將獲得html的第一部分,並且可以開始下載資源,同時我的服務器繼續處理剩餘的請求。設置Transfer-Encoding標頭無法正常工作

由於我的IIS服務器和我的客戶端(CDN,防火牆,負載平衡等)之間的某些第三方服務,我需要設置標頭Transfer-Encoding: Chunked,以便他們知道響應將以塊的形式返回。

我試圖通過調用設置標題:Response.Headers.Add("Transfer-Encoding", "chunked");

出於某種原因,當我這樣做,我等待相當長的時間,甚至是我的IIS服務器直接聯繫時後得到一個空白頁背面,沒有經過全體會第三方。當附加到進程調試時,我沒有看到任何錯誤。
刪除'Transfer-Encoding'標頭的工作原理,但我需要這個標頭爲我正在使用的一些第三方。

任何人都知道我可以在我的web應用程序中設置這個頭?

順便說一句 - 我也嘗試直接在IIS的'Response Headers'部分設置此標頭,並且在執行此操作時響應仍爲空。

+1

時似乎塊傳輸編碼,需要以特定的格式進行編碼的數據IIS將自動切換到塊傳輸編碼。在你的問題中你不清楚你是否執行了這種編碼。你做 ? http://en.wikipedia.org/wiki/Chunked_transfer_encoding – jbl

+1

@jbl - 謝謝!我進一步調查了這一點,並意識到在asp.net中調用'Response.Flush()'不幸的是不會以使用頭部'Transfer-Encoding:chunked'所需的格式輸出數據。響應被髮送,但瀏覽器不知道如何分析它。如果你添加這個作爲一個正確的答案,我會獎勵你的賞金! – gillyb

+0

完成。 thx爲後續! – jbl

回答

1

根據the description on Wikipedia,塊傳輸編碼需要響應體以特定的方式進行編碼,所描述的格式存在的要點之一:

每個塊與所述數據的八位字節的數目開始它嵌入 ,以ASCII表示爲十六進制數字,後面跟隨可選 參數(塊擴展)和終止CRLF序列,接着塊數據爲 。該塊由CRLF終止。如果提供擴展塊 ,則塊大小以分號 結尾,後跟擴展名和可選的等號和值。

據我所知,調用Response.Flush()不會生成這個特定的標記。它只是清空任何緩衝的響應內容給客戶端。

你可以看看「服務器何時使用分塊傳輸編碼?」在這樣的回答: https://stackoverflow.com/a/2711405/1236044

這似乎暗示着,用正確的設置,需要

0

如果禁用緩存將使用分塊傳輸編碼服務器:

設置context.Response.BufferOutputfalse

According to this question

您可能需要進一步設置Server.ScriptTimeout(單位:秒),以避免你的腳本是中斷。