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 回答