request.AutomaticDecompression 属性位于 HttpWebRequest 对象上。
我不确定您是否使用 WCF OData 服务。根据 Scott Hanselman 的博客,这应该适用于 WCF OData 服务。
我猜默认情况下 BasciHttpBinding 不支持压缩。想法来自this blog.
我将创建 BehaviorExtensionElement、CompressionBehaviorSection,如下所示。
public class MessageCompressionBehavior : IDispatchMessageInspector, IServiceBehavior, IClientMessageInspector
{
}
public class CompressionBehaviorExtensionElement :BehaviorExtensionElement
{
}
<extensions>
<behaviorExtensions>
<add name="compression" type="yournamespace.CompressionBehaviorExtensionElement, yourassembly, Version=...., Culture=neutral, PublicKeyToken=......"/>
</behaviorExtensions>
</extensions>
<behaviors>
<serviceBehavior>
<compression />
</serviceBehavior>
</behaviors>
然后将此行为应用于基本 Http 绑定。
IDispatchMessageInspector 和 IClientMessageInspector 将根据数据是发送还是接收来压缩/解压缩数据。
更新日期:2019 年 1 月 29 日
我昨天发现了另一种方法:
第 1 步:如果您的服务是 IIS 托管的,您可以启用动态压缩模块。
然后在 applicationHost.config 中为 SOAP 消息添加 mime 类型,如下所示:
<add mimeType="application/soap+xml" enabled="true" />
<add mimeType="application/soap+xml; charset=utf-8" enabled="true" />
<add mimeType="application/soap+xml; charset=ISO-8895-1" enabled="true" />
第 2 步:自定义 IWebRequestCreate
完成此操作后,您必须使 WCF 使用 HTTP 请求发送“接受编码”标头。您可以创建自定义 IWebRequestCreate 如下所示
public class CompressibleHttpRequestCreator : IWebRequestCreate
{
public CompressibleHttpRequestCreator()
{
}
WebRequest IWebRequestCreate.Create(Uri uri)
{
HttpWebRequest httpWebRequest =
Activator.CreateInstance(typeof(HttpWebRequest),
BindingFlags.CreateInstance | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance,
null, new object[] { uri, null }, null) as HttpWebRequest;
if (httpWebRequest == null)
{
return null;
}
httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip |
DecompressionMethods.Deflate;
return httpWebRequest;
}
}
第 3 步:更改客户端配置中的配置
然后您可以在客户端的 app.config 或 web.config 中添加以下设置:
<system.net>
<webRequestModules>
<remove prefix="http:"/>
<add prefix="http:" type="WcfHttpCompressionEnabler.CompressibleHttpRequestCreator, WcfHttpCompressionEnabler,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</webRequestModules>
</system.net>
解决方案解释at this blog。它还有一个示例代码at this link.
我希望这能为您的问题提供足够的帮助。