2012-05-15 95 views
1

我已閱讀此文WCF Compression文章 我知道對於.net 4.0 WCF壓縮是可用的。使用.net 4 WCF壓縮

我找不到任何明確的解釋如何使用它,我需要定義任何設置或更改綁定?或者它被自動壓縮?

我在IIS7中使用basicHttpBinding。選項「啓用動態壓縮」設置爲true,但我不知道客戶端知道如何壓縮請求並解壓縮響應?

任何解釋,包括設置綁定,以減少消息大小將不勝感激。在4MB帶寬的遠程服務器上工作時,性能非常差。

回答

2

但我不知道客戶端如何知道壓縮請求和解壓縮響應?

這些都是HTTP規範的一部分。由於WCF使用HTTP & IIS,因此它可以利用Web服務器和客戶端HTTP堆棧的內置壓縮功能。

退房節14.3: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

基本上,你的客戶端需要發送一個報頭說它支持壓縮。例如:Accept-Encoding: gzip, deflate。您可以按照WCF客戶端部分的文章中的說明進行設置。您的客戶端然後將正確的標題發送到服務器。

現在在服務器端,IIS將看到該標題,並且它會壓縮響應... 如果配置爲這樣做。您鏈接的文章告訴您如何爲WCF服務設置IIS進行壓縮。然後,服務器將向客戶端發回一個標題,告訴它內容已被壓縮:Content-Encoding: gzip。然後,客戶將解壓縮響應並繼續其快樂的方式。

這幾乎是它;這只是讓客戶頭部正確並且服務器配置爲發送回壓縮響應的問題。文章告訴你如何做到這一點。希望幫助

0

使用http編碼時,啓用壓縮響應的唯一方法是使用dynamic compression built-in to IIS7 and higher

但我不知道客戶端如何知道壓縮請求和解壓縮響應?

下面是HTTP提供的開箱即用的描述,它可以與WCF HTTP(S)編碼一起使用。除此之外,WCF 4.5還提供gzip and deflatecompression of its binary encoding

壓縮響應是HTTP標準的一部分。在它的請求,客戶端信號到服務器,其壓縮方法(gzip的,放氣,...)它支持由以下頭的手段:

Accept-Encoding: gzip, deflate 

的服務器,在其自行決定,無限的智慧和神祕方法可以自由地忽略該頭部並且發送未壓縮的響應,或者可以選擇由客戶端提供的算法中的任何一種,例如回答如下頭部並壓縮響應主體。

Content-Encoding: gzip 

爲了使問題更復雜,服務器可能會也設置了下面的頭:

Transfer-Encoding: chunked 

這使服務器忽略另外的強制性規定Content-Length頭,作爲一般的HTTP頭,具有在HTTP主體之前。 (設置chunked編碼affects the way the body gets encoded。)所以,現在它可以即時壓縮響應主體,即在壓縮時吐出字節,而不必等待整個身體的壓縮完成,只是爲了能夠確定壓縮結果的內容長度。這可以節省服務器端的大量內存。 (客戶端,然而,現已置於暗處作爲對壓縮的響應的總大小,直到它完成接收整個響應,使得它的減壓略微低效率)


注意然而,使用Accept-EncodingContent-Encoding,正如我剛纔所描述的,以透明壓縮反應竟是a stupid idea,根據HTTP合着者羅伊菲爾丁,哪些應該被使用,而不是在請求以下標題:

TE: gzip, deflate 

而SERV呃,如果選擇進行壓縮,將下面的頭添加到它的響應:

Transfer-Encoding: gzip, chunked 

和以前一樣,chunked如果服務器要省略Content-Length是必要的。

否則,TE/Transfer-Encoding組合是語法上等同於所述Accept-Encoding/Content-Encoding組合,但含義是不同的,如可以從this longish discussion中收集。

問題的要點是:TE /傳輸編碼使得壓縮運輸細節,而接受編碼/內容編碼表示壓縮版本作爲實際數據(在HTTP用語實體),具有後者緩存請求,代理等不幸後果的數量。然而,TE/Transfer-Encoding船很早就航行了,而且我們被AE/CE組合所困住,它受到大多數客戶和服務器的支持,其含義實際上更接近於TE/TE


當談到壓縮請求在HTTP,他們很少在實踐中使用,且有客戶端要弄清楚,如果服務器支持,沒有標準的方式。您可以通過帶外(例如硬編碼)告訴客戶服務器瞭解壓縮請求(和configure the server appropriately)。或者你有你的客戶主動嘗試壓縮一次,如果它產生一個400 Bad Request(至少這是一個IIS 7.5將返回),你回落到非壓縮請求。

2

請注意,壓縮已添加到WCF 4.5。都能在這裏找到:http://msdn.microsoft.com/en-us/library/aa751889(v=vs.110).aspx

你必須使用一個自定義綁定來啓用它:

<customBinding> 
    <binding name="BinaryCompressionBinding"> 
    <binaryMessageEncoding compressionFormat="GZip"/> 
    <httpTransport /> 
    </binding> 
</customBinding> 

只用二進制編碼工作。此外,你必須意識到你的情況。如果您在IIS中託管,則壓縮可能已經開啓。請看這裏:http://blogs.msdn.com/b/dmetzgar/archive/2011/04/29/automatic-decompression-in-wcf.aspx