消息編碼器描述here應該做的工作。
我已經使用從上面的文章中提供的鏈接(從this的InstallDrive \ WF_WCF_Samples \ WCF \ Extensibility \ MessageEncoder \ Compression項目)和Fiddler下載的示例進行了測試。
請注意,MSDN示例有一個錯誤,您需要修復才能正常工作。在GZipMessageEncoderFactory
類,CompressBuffer
方法,以下行
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
應與
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
代替將上述固定整個消息體將被壓縮後。
爲了檢查壓縮是否正確,您可以使用Fiddler中的AutoDecode選項。但是,如果AutoDecode具有Content-Encoding: gzip
HTTP標頭,它將僅解壓縮該消息。
向WCF消息調用添加HTTP標頭並不是兩岸關係,因爲WCF被設計爲傳輸不可知的,WCF應用程序不應處理特定於某個傳輸方法的元素。
然而,對於本申請的目的,我能夠使用下面的代碼段來做到這一點:
public string Echo(string input)
{
using (OperationContextScope opScope = new OperationContextScope((IContextChannel)base.Channel))
{
HttpRequestMessageProperty reqProps = new HttpRequestMessageProperty();
reqProps.Headers["Content-Encoding"] = "gzip";
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = reqProps;
return base.Channel.Echo(input);
}
}
回聲是從MSDN樣品客戶端的方法之一,在其內部我訪問當前操作上下文添加一個HTTP頭。
如果您需要其他幫助,請讓我知道。
不是一個真正的直接答案(所以不作爲一個發佈),但我會通過發送更少的字節來支持這一點 - 在我的情況下,通過換出序列化程序 – 2010-12-11 10:09:04
(讓我知道你是否想要一些細節 - 這是一個話題,我可以談論幾個小時) – 2010-12-11 10:24:17
Marc,是的,不太詳細的序列化器也是一個非常簡潔的序列化器選項。這種方法的一個好處是,它完全將壓縮問題從消息編碼中分離出來,幾乎是傳統的HTTP壓縮實現的響應。 – 2010-12-11 10:42:48