24

WCF Web サービスにアクセスする Silverlight 2 ベータ 2 アプリケーションがあります。このため、現在は basicHttp バインディングのみを使用できます。Web サービスは、かなり大量の XML データを返します。これは、帯域幅の使用の観点からはかなり無駄に思えます。応答を圧縮すると 5 分の 1 になるからです (実際には、応答を txt ファイルに貼り付けて圧縮しました)。

リクエストには「Accept-Encoding: gzip, deflate」があります。WCF サービスでレスポンスを gzip (または圧縮) する方法はありますか?

私はこのリンクを見つけましたが、すぐに使用できる機能については少し複雑に思えます。

OK - 最初は、System.IO.Compression を使用するソリューションを答えとしてマークしました。さて、結局のところ:

  1. IIS7の動的圧縮はずっと機能していました。IE 用の Nikhil の Web Developer Helper プラグインが動作していないことがわかりました。私の推測では、SL は Web サービスの呼び出しをブラウザーに渡すので、ブラウザーはそれを「隠れて」処理し、Nikhil のツールは圧縮された応答を決して見ることはありません。これは、ブラウザ アプリケーションの外部のトラフィックを監視する Fiddler を使用して確認できました。フィドラーでは、応答は実際には gzip 圧縮されていました!!

  2. System.IO.Compression ソリューションのもう 1 つの問題は、Silverlight CLR に System.IO.Compression が存在しないことです。

したがって、私の見解では、Silverlight で WCF 圧縮を有効にする最も簡単な方法は、IIS7 で動的圧縮を有効にし、コードをまったく記述しないことです。

4

4 に答える 4

12

WCF の WS-Compression を使用すると、バインドで圧縮を構成できます。

Pablo M. Cibraro によるWCF の WS-Compression を参照してください。

または、 「System.IO.Compression.GZipStream クラスを使用して送信 WCF メッセージを圧縮するエンコーダー チャネルを作成する」MicrosoftのGZip エンコーダー サンプルを試してください。

于 2009-01-12T01:47:06.687 に答える
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);

私にとってはうまくいきました。

于 2008-08-13T16:28:06.933 に答える
10

IIS7 を使用している場合は、圧縮モジュールをご覧ください。これにより、サーバーへの HTTP 要求の圧縮を構成できます。

于 2008-08-13T18:22:03.273 に答える
3

また、サイトの圧縮を有効にするだけでなく、セクションのapplicationHost.config下に MIME タイプを追加する必要がある場合があることにも注意してください。<httpCompression><dynamicTypes>

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

特定の動的応答が圧縮されていない (一部は圧縮されている) 場合、MIME タイプの問題である可能性があります。Fiddler を使用して、要求に関連付けられた詳細を取得します。失敗した要求のトレースは、IIS が応答の圧縮を試みているかどうかを判断するのに役立ちます。圧縮が正しく設定されている場合、トレース出力NO_MATCHING_CONTENT_TYPE完全なトレースセクションに が表示されます。

于 2010-06-16T17:24:33.160 に答える