我正在尝试gzip编码我的WCF消息的内容。我看到的大多数例子都谈到了BindingElement和MessageEncodingFactory。
在IDispatchMessageInspector的BeforeSendReply中执行此操作是否有任何副作用?即我收到消息,将其压缩并替换原始消息。
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
HttpResponseMessageProperty httpResponseProperty = new HttpResponseMessageProperty();
httpResponseProperty.Headers.Add(HttpResponseHeader.ContentEncoding, "gzip");
reply.Properties[HttpResponseMessageProperty.Name] = httpResponseProperty;
reply = gzip(reply);
}
gzip是提取(xml)主体并用gzip压缩字节流替换它的函数。
我正在寻找符合
的内容谢谢大家!
答案 0 :(得分:2)
这可能有效,也可能无效,具体取决于您使用的绑定。如果您正在使用任何基于SOAP的绑定(BasicHttpBinding,WSHttpBinding,NetTcpBinding等),这将无法工作,因为它使用的编码器不知道如何将消息的gzip压缩版本写入线路(它使用毕竟是一个XML编写器。)
如果您使用非SOAP绑定(例如WebHttpBinding),那么它可能会起作用(您应该尝试进行确认)。如果你正在处理非常大的消息,你将承担几次缓冲的惩罚(在GZip之前和GZip之后)。您需要记住将WebBodyFormatMessageProperty
设置为Raw
以确保编码器不会尝试重新编码消息(有关详细信息,请参阅this post)并格式化消息恰当。
此外,您需要确保客户端了解它。特别针对您的第三点 - 客户端总是将消息视为一系列字节,并由它来“理解”它(例如,将其视为HTTP响应,分离它的标题和正文等等。