2008-08-13 13 views
23

私はWCF WebサービスにアクセスするSilverlight 2 Beta 2アプリケーションを持っています。このため、現在のところ、basicHttpバインディングのみを使用できます。 Webサービスは、XMLデータのかなり大きな金額を返します。これは、帯域幅の使用の観点からは、レスポンスが圧縮された場合、5分の1(実際にはレスポンスをtxtファイルに貼り付けて圧縮したもの)としてかなり無駄に見えます。SilverlightでWCFに圧縮を追加する最も簡単な方法は何ですか?

要求に「Accept-Encoding:gzip、deflate」があります。 - WCFサービスで応答をgzip(または圧縮)する方法はありますか?

私はこれを見つけましたlinkしかし、それは確かにすぐに使用できるIMHOで処理する必要がある機能のための少し複雑なようです。

OK - 最初は、System.IO.Compressionを答えとしてマークしました。私は決してIIS7の動的圧縮を機能させることはできませんでした。まあ、結局のところ:IIS7

  1. 動的圧縮は、アルに沿って取り組んました。それはちょうどIEのためのNikhilのウェブ開発者ヘルパープラグインがそれを働かせることを示さなかったことである。私の推測では、ブラウザが「カバーの下に」それを処理し、ニキルのツールは、圧縮された応答を見たことがないことを、ブラウザにオフSLの手からのWebサービスの呼び出しということです。ブラウザアプリケーションの外部にあるトラフィックを監視するFiddlerを使用してこれを確認できました。フィドラーでは、応答は、実際には、gzip圧縮された!

  2. System.IO.Compressionソリューションで、他の問題は、System.IO.Compressionは、SilverlightのCLRに存在しないということです。だから、

私の観点から、SilverlightでWCFの圧縮を有効にする最も簡単な方法は、IIS7で動的圧縮を有効にして、まったくコードを書いていないことです。

+0

動的圧縮は、一部の要求(つまり、頻繁に呼び出されるIISと見なされるもの)に対してのみ機能します。だから素晴らしい機能ですが、あなたはそれを制御できません。ユーザーがログインしたときに私は本当に大きなコールを持っていますが、1日に1回のように起こります。それは圧縮されていません。 –

答えて

10

あなたはIIS7を使用している場合は、Compression Moduleを見てみましょう。これにより、サーバーへのHTTP要求の圧縮を構成できます。

+0

ここにいくつかの注意点があります:私の仕事用プロキシは受け入れgzipヘッダー(wtf、右?)を削除します。そして、あなたはクライアントに行くデータを圧縮しているだけです。 – russau

11

最近WCFプロジェクトを実行しているときに、WCFが圧縮を実行するネイティブな方法はありませんでした。私はSystem.IO.Compression名前空間を使い、簡単なコンプレッサーを作ったばかりです。ここで私は

public static class CompressedSerializer 
{ 
    /// <summary> 
    /// Decompresses the specified compressed data. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="compressedData">The compressed data.</param> 
    /// <returns></returns> 
    public static T Decompress<T>(byte[] compressedData) where T : class 
    { 
     T result = null; 
     using (MemoryStream memory = new MemoryStream()) 
     { 
      memory.Write(compressedData, 0, compressedData.Length); 
      memory.Position = 0L; 

      using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true)) 
      { 
       zip.Flush(); 
       var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
       result = formatter.Deserialize(zip) as T; 
      } 
     } 

     return result; 
    } 

    /// <summary> 
    /// Compresses the specified data. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="data">The data.</param> 
    /// <returns></returns> 
    public static byte[] Compress<T>(T data) 
    { 
     byte[] result = null; 
     using (MemoryStream memory = new MemoryStream()) 
     { 
      using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true)) 
      { 
       var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
       formatter.Serialize(zip, data); 
      } 

      result = memory.ToArray(); 
     } 

     return result; 
    } 
} 

を使用したコードだ後、私はちょうど私のサービスは、私のためにうまくいったように

void ReceiveData(byte[] data); 

のように、入力としてバイト配列にかかりました。

+1

GZipStreamはSilverlight 2 CLRでは使用できません。 DimeBrainはここでSharpZipLibを実装しています:http://dimebrain.com/2008/06/compression-i-1.html – russau

12

WS-Compression for WCFでは、バインディングで圧縮を構成できます。

WS-Compression for WCFあるいは

パブロM. Cibraroによって見る、System.IO.Compressionを使用するエンコーダチャネルを作成し、」Microsoftの GZip Encoder Sampleを試みます。特定の動的な場合

<add mimeType="application/soap+msbin1" enabled="true" /> 

:あなたがサイトの圧縮を有効にするだけで<httpCompression><dynamicTypes>セクションの下applicationHost.configにMIMEタイプを追加する必要があることもに注意すべきである「

+3

1つの注意点は、Silverlight 2はWSバインディングをまったくサポートしていない、つまりbasicHttpバインディングだけです。 – caryden

3

を送信WCFメッセージを圧縮するGZipStreamクラスレスポンスが圧縮されていない(いくつかの場合は)MIMEタイプの問題である可能性がありますFiddlerを使用してリクエストに関連する詳細を取得するリクエストのトレースが失敗すると、IISがレスポンスを圧縮しようとしているかどうかを判断するのに役立ちます。圧縮が正しく設定されていると、の完全なトレースにNO_MATCHING_CONTENT_TYPEが表示されますトレース出力のセクション。

+0

それは私のためにそれをしました。ただし、web.configの設定は無視されるため、この設定はC:\ Windows \ System32 \ inetsrv \ config \ applicationHost.configファイルで設定する必要があります。 私はそれを変更した直後に働いた。 – R4cOON

関連する問題