2012-11-12 38 views
1

我有一個簡單的HTML和JavaScript客戶端應用程序與WCF(而不是一個asp.net應用程序)一起工作。我需要在靜態頁面中更改一些變量,因此我認爲Response.Filter對我來說是最合適的選擇。我寫了幾行代碼,它工作正常,但是在瀏覽器刷新幾次之後,我發現有一個錯誤。有東西破壞了頁面的編碼。我究竟做錯了什麼?Response.Filter隨機打破編碼

的Global.asax:(我試過其他活動太多,但沒有任何變化)

private void Application_PostReleaseRequestState(object sender, System.EventArgs e) 
{ 
    if (Request.CurrentExecutionFilePathExtension.EndsWith(".html") || Request.CurrentExecutionFilePathExtension.EndsWith(".js")) 
    { 
     Response.Filter = new ContentFilter(Response.Filter); 
    } 
} 

ContentFilter.cs

public class ContentFilter : MemoryStream 
{ 
    private Stream outputStream = null; 

    private Regex version = new Regex("%version%", RegexOptions.Compiled | RegexOptions.Multiline); 


    public ContentFilter(Stream output) 
    { 
     outputStream = output; 
    } 


    public override void Write(byte[] buffer, int offset, int count) 
    { 
     // Convert the content in buffer to a string 
     string contentInBuffer = UTF8Encoding.UTF8.GetString(buffer); 

     contentInBuffer = version.Replace(contentInBuffer, "2"); 

     outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), offset, UTF8Encoding.UTF8.GetByteCount(contentInBuffer)); 
    } 
} 

chome failure

注:我在Windows上使用IIS 7.5 8.

我看到這些,而我在調試ContentFilter.cs寫我作爲contentInBuffer變量的值。默認情況下,我在IIS設置中使用GZIP壓縮,這可能就是這樣。

`\ B \ 0 \ 0 \ 0 \ 0 \ 0 \ 0Znw3 \ B(\「VDI8A5a R,M \ T> @t \ N(P/+] $B3s| _n ...

+0

您是否檢查了Fiddler中的響應內容?我已經看到了與Response.Filter相關的幾個問題,但它們大多與錯誤地更新內容有關。我首先要驗證標題和內容字節。你在回覆中使用國際角色嗎? – 2012-11-12 04:44:42

+0

是的,有土耳其的字符,如ö,ç,ü,ş和»。我會用提琴檢查它。我不明白爲什麼,但第一次打開頁面,3次刷新後就開始失敗。 – iboware

+0

這是我的提琴手的輸出。 :) – iboware

回答

1

你忽略傳遞給你Write實施offsetcount,它可能有助於使用GetString覆蓋還需要一個索引和計數。

然而,恐怕還有其他一些問題,你在Write函數中收到的數據將會以大塊的形式出現,如果第一個塊以「%vers」結尾,第二個以「離子%」開始?

另外,由於非ASCII字符在UTF-8中表示爲多個字節,因此一個Unicode字符可能會「傳播」兩次後續調用Write,這將導致UTF8Encoding.UTF8.GetString失敗。

+0

我試圖禁用IIS壓縮,現在它運作良好,但它不是一個解決方案。你是正確的抵消和計數。我只是想先讓它工作。 我需要這個,因爲緩存的JavaScript和CSS文件導致一些問題。由於我的客戶端應用程序不是ASP.NET應用程序,因此我需要使用戶的瀏覽器緩存無效。你有什麼更好的主意來實現這一目標? – iboware

+0

@Amount是正確的 - 由於響應中的非ASCII字符,您必須對數據進行緩衝,然後才能對其進行更改。 – 2012-11-12 21:11:06

1

我也遇到過這個問題,這是由於GZip壓縮靜態內容在IIS中造成的。爲了打擊腐敗,通過以下Web.Config進入我禁用靜態壓縮:

<system.webServer> 
    <urlCompression doStaticCompression="false" /> 
</system.webServer> 

,同時開啓了超過2700個字節的文件較小默認情況下不壓縮(請參閱IIS壓縮設置),所以你只有會看到這個比靜態內容更大。

希望這會有所幫助。