2

セルフホステッド WCF サービスにオプションの gzip 圧縮を追加するにはどうすればよいですか? 私はこのシナリオにWebHttpBinding. Acceptヘッダーに文字列が含まれているかどうかを確認しgzip、コンテンツよりも圧縮したい。

カスタム属性を使用したいと思います。これまでのところ、カスタム属性を使用して XML と JSON の出力を切り替えることができますが、出力を圧縮する方法がわかりません。

私のエンコーダ スイッチ属性では、IDispatchMessageFormatter必要に応じて変更するインターフェイスを実装しましたXmlObjectSerializer。しかし、それを変更するために出力がどのように生成されるのかわかりません。

誰かが私に可能な解決策を指摘してくれたらいいのにと思います。

4

1 に答える 1

4

これは属性ではありませんが、WCF サービスの応答を圧縮する基本的なコードであり、必要に応じて属性にまとめることができます。

public static void CompressResponseStream(HttpContext context = null)
{
    if (context == null)
        context = HttpContext.Current;

    string encodings = context.Request.Headers.Get("Accept-Encoding");

    if (!string.IsNullOrEmpty(encodings))
    {
        encodings = encodings.ToLowerInvariant();

        if (encodings.Contains("deflate"))
        {
            context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
            context.Response.AppendHeader("Content-Encoding", "deflate");
            context.Response.AppendHeader("X-CompressResponseStream", "deflate");
        }
        else if (encodings.Contains("gzip"))
        {
            context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
            context.Response.AppendHeader("Content-Encoding", "gzip");
            context.Response.AppendHeader("X-CompressResponseStream", "gzip");
        }
        else
        {
            context.Response.AppendHeader("X-CompressResponseStream", "no-known-accept");
        }
    }
}

[編集]コメントに対処するには:

応答にプロパティを設定するため、Web サービス操作の本文の任意の場所で呼び出すだけです。

[OperationContract]
public ReturnType GetInformation(...) {
    // do some stuff
    CompressResponseStream();
}
于 2013-04-17T13:49:10.693 に答える