2010-12-11 10 views
7

私はenable inbound HTTP compression on ASP.NETに管理しています(つまり、HTTP の要求は応答だけでなく)、クライアント側(C#/ .NET 4.0アプリ)では苦労しています。WCF .NETからのHTTP要求をトランスポートレベルで圧縮する方法は?

Iはたい:

  • は、WCFチャネルによって放射されたすべてのアウトバウンドHTTPリクエストにHTTPヘッダーをGZipを

Content-Encoding: gzip

  • 圧縮HTTPボディを追加します。これまでを動作しません

    ソリューション:

    • IClientMessageInspectorと私はメッセージを圧縮することができますが、封筒が圧縮されていないとして、それは全体のHTTPボディを考慮していません。
    • カスタムメッセージエンコーダと同じですが、エンベロープではなくメッセージを圧縮します.HTTPリクエストヘッダーには影響しません。

    IHttpModuleの動作(最初の応答を参照)をクライアント側で模倣する方法はありますか?

  • +2

    実際には直接的な答えではありません(1つとして投稿されていません)。しかし、私は、何かもっとコンパクト(同じデータで、ワイヤ上ではるかに小さい) –

    +0

    (いくつかの詳細を知りたい場合は教えてください) –

    +0

    Marc、あまり冗長でないシリアライザもオプション。このアプローチの利点の1つは、圧縮の問題をメッセージのエンコーディングから完全に切り離すことです。これは、古典的なHTTP圧縮がレスポンスのために達成するものとほとんど同じです。 –

    答えて

    5

    hereと記載されているメッセージエンコーダは、このジョブを実行する必要があります。

    上記の記事(InstallDrive \ WF_WCF_Samples \ WCF \ Extensibility \ MessageEncoder \ Compressionプロジェクトのthisから)と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が特定のトランスポート方法に固有の要素を処理しないように、WCFアプリケーションがトランスポートに依存しないように設計されているため、WCFメッセージ呼び出しにHTTPヘッダーを追加することは困難です。

    しかし、このアプリケーションの目的のために、私は次のコードを使用してそれを行うことができました:

    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

    FYI - 私はMSDNの例でバグに直面しませんでしたが、それを仮定して時間を無駄にしました。 – hB0

    -1

    私は圧縮を実現するために暗号化を有効にできると思っていたでしょう。私は、すべての一般的な暗号化アルゴリズムがデータを圧縮し、圧縮されたデータに明白なパターンを生成しないようにすることが正しいと思います。副作用として、あなたのサービスはより安全になります:)

    +0

    私はそれが不正確だと思います:https://security.stackexchange.com/a/19970/45228 – DarcyThomas

    関連する問題