Wcf 在BeforeSendReply(IDispatchMessageInspector)中实现gzip

Wcf 在BeforeSendReply(IDispatchMessageInspector)中实现gzip,wcf,Wcf,我正在尝试对WCF消息的内容进行gzip编码。我看到的大多数示例都是关于BindingElement和MessageEncodingFactory的 在IDispatchMessageInspector的BeforeSendReply中执行此操作是否有任何副作用?i、 我把邮件收起来,拉上拉链,换掉原来的邮件 public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlation

我正在尝试对WCF消息的内容进行gzip编码。我看到的大多数示例都是关于BindingElement和MessageEncodingFactory的

在IDispatchMessageInspector的BeforeSendReply中执行此操作是否有任何副作用?i、 我把邮件收起来,拉上拉链,换掉原来的邮件

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字节流替换它的函数

我在找一些类似于

  • 不!!那会杀死你的服务器
  • 不,这会使消息中断的时间比x长
  • 这不是一个好主意,因为客户端会将其视为一条以随机字节序列作为正文的消息,而不是gzip消息
  • 是的,这很有效。对性能的影响也不会那么大

谢谢大家

这可能有效,也可能无效,具体取决于您使用的绑定。如果您使用的是任何基于SOAP的绑定(BasicHttpBinding、WSHttpBinding、NetTcpBinding等等),那么这将不起作用,因为它所使用的编码器不知道如何将消息的gzip版本写入网络(毕竟它使用XML编写器)

如果您使用非SOAP绑定(例如WebHttpBinding),那么它可能会工作(您应该尝试确认)。如果您处理的是非常大的消息,那么您将受到几次缓冲的惩罚(在GZip之前和之后)。您需要记住将
WebBodyFormatMessageProperty
设置为
Raw
,以确保编码器不会尝试重新编码消息(请参阅以获取更多信息),并正确格式化消息


此外,您需要确保客户理解它。特别是关于您的第三点-客户端总是将消息视为一系列字节,由它来“理解”它(例如,将其视为HTTP响应,将其头和正文分开,等等)。

非常感谢,特别是关于WebBodyFormatMessageProperty的一点-我不知道。