0

現在のプロジェクトでは、Castle Windsor を使用して .NET 4 アプリケーションで WCF を構成しています。やり取りするデータが大きくなる可能性があるため、何らかの圧縮を行いたいと考えています (特にクライアントからサーバーへ)。Google でこれを検索すると、2 つの解決策が得られました。.net 45 の組み込みの圧縮サポートを使用するか (Windows XP を正式にサポートする必要があるため、現時点では .net 45 に移行できません)、Microsoft が提供するサンプル エンコーダーを使用します ( http://msdn.microsoft.com/en-us/library/ms751458.aspx )。カスタム エンコーダー オプションはそれほど悪くないように見えるので、.net 45 に移行できるようになるまで試してみたいと思います。 .

これに関するアイデアはありますか?

ありがとうマーカス

4

1 に答える 1

0

関連する WCF クラスのソース コードを調査した結果、必要なソリューションを見つけることができました。現在、バインディングに WSHttpBinding を使用しています。これにはメソッド CreateBindingElements があり、使用されているバインド要素のコレクションを返し、オーバーライドできます。したがって、WsHttpBinding クラスから派生し、コレクションを返す前に GZipMessageEncoding をコレクションに挿入しました。

public class GZipWSHttpBinding : WSHttpBinding
{
    public override BindingElementCollection CreateBindingElements()
    {
        BindingElementCollection bec = base.CreateBindingElements();

        int index = bec.Count - 1;
        while (index >= 0 && !(bec[index] is MessageEncodingBindingElement))
            index--;

        if (index >= 0)
        {
            GZipMessageEncodingBindingElement gZipCompression =
                new GZipMessageEncodingBindingElement(bec[index] as MessageEncodingBindingElement);
            bec[index] = gZipCompression;
        }

        return bec;
    }
}

残っている唯一のことは、Windsor インストーラーの WsHttpBinding クラスの代わりにこのクラスを使用することと、gzip 圧縮が配置されていることです。

宜しくお願いします マーカス

于 2013-11-03T09:18:28.460 に答える