0

在我们当前的项目中,我们使用 Castle Windsor 在 .NET 4 应用程序上配置 WCF。随着我们来回移动的数据可能会增长,我们希望进行某种压缩(尤其是从客户端到服务器)。在google上搜索这个带来了两个解决方案:使用.net 45的内置压缩支持(由于我们正式需要支持Windows XP,现在我们无法迁移到.net 45)或使用微软提供的示例编码器(http://msdn.microsoft.com/en-us/library/ms751458.aspx)。由于自定义编码器选项看起来并不那么糟糕,我想尝试一下,直到我们可以迁移到 .net 45。我唯一真正不知道的是是否可以使用 Castle Windsor 来配置这个场景.

对此有什么想法吗?

谢谢马库斯

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