2010-08-10 91 views
0

這是一個艱難的。我有一個響應過濾器設置來轉換HTML,然後再吐出到瀏覽器(http://aspnetresources.com/articles/HttpFilters)。這適用於所有人,但我的。事實上,它一直在我的機器上工作,直到我必須進行硬重置,因爲它被鎖定。System.Text.Ecoding.UTF8.GetString返回垃圾

public override void Write(byte[] buffer, int offset, int count) 
{ 
    string strBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); 

對於其他人(和我以前的版本)strBuffer包含HTML。無論出於何種原因,它都會爲我返回垃圾字符。有任何想法嗎?我拉我的頭髮!

更新

原來,「啓用動態內容壓縮」導致了問題。出於某種原因,在傳入過濾器之前它會被壓縮。

解決方案

設置 「dynamicCompressionBeforeCache」 假固定問題的web.config中。

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="false" /> 
+0

檢查緩衝區並查看返回的實際字節。它看起來像Unicode還是不是? – mquander 2010-08-10 17:42:17

+0

Unicode究竟是什麼樣的?前幾個字節是31,139,8,0,0,0,0,0,4 ... – Micah 2010-08-10 17:50:04

回答

0

聽起來像是出了點問題。鎖定後我也有一些奇怪的行爲。 對我有用的是刪除C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \臨時ASP.NET文件中的臨時文件

+0

我試了幾次。這通常是清理奇怪的伎倆,但這次不行。 – Micah 2010-08-10 18:27:52

0

您已經指定了這些字節:31,139,8,0 ,0,0,0,0,0 4

這不是有效的UTF-8。特別是,它將意味着Unicode字符U + 0031(「INFORMATION SEPARATOR ONE」),接着是字節139和8 ...,然後是139,然後是8,這不是有效的UTF-8字節序列。即使那些確實形成了一個有效的序列,那麼您將有5個Unicode U + 0000字符(NUL),然後是U + 0004(結束髮送)。幾乎沒有有效的HTML。

我不知道你在做什麼實際上是過濾,但它不是有效的UTF-8文本。事實上,它根本不可能是文字。是否有可能實際上試圖將過濾器應用於二進制數據,如圖像?

,你有你的過濾方法的另一個根本問題

注意:你假設每個緩衝區包含完整文本。你很可能接收到一個包含字符前半部分的緩衝區,然後是包含其餘部分的第二個緩衝區。這就是System.Text.Decoder接口的作用 - 它是有狀態的,記住部分字符。

+0

原來,關閉「啓用動態內容壓縮」似乎修復了它。爲什麼在傳入我的過濾器之前數據會被壓縮?壓縮是否發生在鏈條的更下方?模塊聲明順序是否重要? – Micah 2010-08-10 18:29:28

+0

@Micah:我不知道,我害怕 - 但它被壓縮無疑會解釋爲什麼這不是文本數據。 – 2010-08-10 19:53:06