在对所涉及的 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 压缩已经到位。
最好的问候马库斯