【问题标题】:Castle Windsor WCFFacility compression温莎城堡 WCFF 设施压缩
【发布时间】:2013-10-22 06:38:48
【问题描述】:

在我们当前的项目中,我们使用 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 来配置这个场景.

对此有何想法?

谢谢 马库斯

【问题讨论】:

  • 是的,应该可以。在 Castle Windsor 中配置服务以使用 GZip 编码元素时,您可以自定义端点的绑定。

标签: compression castle-windsor wcffacility


【解决方案1】:

在对所涉及的 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压缩就位。

最好的问候 马库斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多