2010-12-11 18 views
7

我設法enable inbound HTTP compression on ASP.NET(即壓縮HTTP 請求,不只是響應),但我現在在客戶端(C#/ .NET 4.0應用程序)掙扎。如何在傳輸級別壓縮來自WCF .NET的HTTP請求?

我想:

  • 用gzip

添加HTTP頭Content-Encoding: gzip

  • 壓縮HTTP主體成由WCF通道發射的所有出站HTTP請求。

    的解決方案,不工作至今:

    • IClientMessageInspector我可以壓縮的消息,但由於信封沒有壓縮它並不佔整個HTTP身體。
    • 與自定義消息編碼器相同,壓縮消息而不是信封,對HTTP請求標頭沒有影響。

    任何想法如何在客戶端模仿IHttpModule行爲(請參閱初始響應)?

  • +2

    不是一個真正的直接答案(所以不作爲一個發佈),但我會通過發送更少的字節來支持這一點 - 在我的情況下,通過換出序列化程序 – 2010-12-11 10:09:04

    +0

    (讓我知道你是否想要一些細節 - 這是一個話題,我可以談論幾個小時) – 2010-12-11 10:24:17

    +0

    Marc,是的,不太詳細的序列化器也是一個非常簡潔的序列化器選項。這種方法的一個好處是,它完全將壓縮問題從消息編碼中分離出來,幾乎是傳統的HTTP壓縮實現的響應。 – 2010-12-11 10:42:48

    回答

    5

    消息編碼器描述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頭。

    如果您需要其他幫助,請讓我知道。

    +1

    僅供參考 - 我沒有面對與MSDN示例的錯誤 - 但浪費時間假設.. – hB0 2014-11-06 15:07:19

    -1

    我原以爲你可以啓用加密來實現壓縮。我認爲我說得對,所有常用的加密算法也會壓縮數據以避免在壓縮數據中產生明顯的模式。作爲一個副作用,你的服務將更安全:)

    +0

    我認爲這是不準確的:https://security.stackexchange.com/a/19970/45228 – DarcyThomas 2017-09-12 03:26:09