2013-01-22 40 views
0

我在使用Silverlight 5請求Gzip內容時遇到了麻煩。爲了減少使用的帶寬,我想使用gzip來處理從我們的web服務請求的內容,但不幸的是,這不起作用。在Silverlight中請求GZip內容

我正在使用客戶端堆棧併發送一個HttpWebRequest。我嘗試設置Accept-Encoding標頭,但它告訴我,我不允許直接更改它 - 並且沒有其他屬性!

那麼如何發送自定義的Accept-Encoding標頭?

這是我在我的應用程序構造函數的代碼:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp); 

這是我創建的請求,並設置頁眉:

var webRequest = (HttpWebRequest)WebRequest.Create(requestUri); 
webRequest.Headers["Accept-Encoding"] = "gzip, deflate"; 

這是例外:

{System.ArgumentException: The 'Accept-Encoding' header cannot be modified directly. 
Parameter name: name 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at MyClass} 

回答

0

不幸的答案是:如果要gzip,不要使用客戶端堆棧(瀏覽器堆棧會爲您處理此操作已經)

0

在這種情況下,我很幸運能夠控制服務端以及客戶端。我現在所做的是添加一個額外的自定義標題,它將基本上覆蓋Accept-Encoding標題。我稱之爲「Accept-Encoding-Override」。當我的服務遇到這個頭時,無論Accept-Encoding頭中有什麼,它都會壓縮內容。在客戶端Silverlight方面,我檢查響應中的Content-Encoding標頭,如果需要,使用SharpZipLib解壓縮(DotNetZip不起作用)。

我仍然標記dotMorten作爲他的迴應是我的問題的實際答案。使用ClientStack時無法設置標題。

+0

只是要注意:我有一個WP7/WP8庫,使得這些請求的處理更容易。它應該是爲Silverlight編譯它的一個簡單問題,並將標題和Content-Encoding檢查更改爲您的自定義檢查,並且您應該儘量少用額外的代碼。看到這裏:https://github.com/dotMorten/SharpGIS.GZipWebClient/ – dotMorten

+0

我在我的研究中發現你的圖書館,它可能對別人有用,但對我來說它沒有用。 :)我已經有一個工作的基礎設施,並且我在客戶端所做的所有事情都是另外發送我的自定義標題,並在我的解析方法中注入一個GZipStream,但前提是內容編碼是gzip。這樣,當響應不是預期的gzip時,我的代碼仍然可以工作。 – user1908061

+0

??如果回覆沒有被壓縮,我的代碼不會解壓縮。您可以通過調用RegisterPrefix在應用程序啓動時只寫兩行代碼,並且整個應用程序中的所有Web請求現在都會盡可能地嘗試獲取gzip(但您也可以按照GZipWebClient的請求執行此操作) – dotMorten