获取 IIS gzip 压缩以与 .NET 4.0 上的 Silverlight WCF 服务配合使用



我有一个 Silverlight 项目通过 WCF Web 服务从 IIS 7.0 服务器获取数据。返回的数据通常很大,因此压缩似乎是一个不错的选择。但是,对于我的生活,我无法让它工作。

这是我到目前为止尝试过的

  • 为所有 MIME 类型 (/( 启用压缩(动态和静态(。已验证它是否有效(aspx 页面上的点击会根据小提琴手返回 gzip 数据(
  • 在 WCF 和压缩上做了很多挖掘。我读了一些类似于WCF 4.5的内容,有一些东西可以启用/禁用gzip。我不确定这是否意味着无法使用 IIS 7.0 动态压缩,或者它是否无关。
  • 还获得了一些使用GZipEncoder的示例(来自Microsoft WCF示例(

这就是我想知道的

  • 使用 Silverlight 从 IIS 7.0 服务器上承载的 WCF 读取数据使用 .NET 4.0,是否可以为 XML 启用压缩通过简单地弄乱 Web.Config 来响应/applicationHost.Config?
  • 如果没有,让它
  • 工作的最简单方法是什么(比如,添加一个 dll,更改我的 Web.Config 并完成!

谢谢大家!

编辑:感谢所有的答案。只是一个快速说明 - 如果有人可以确认它不适用于 WCF 4.0"或者"仅适用于 WCF 4.0,如果您这样做,那会有所帮助。

我们已经为

WCF 提供了 GZip 压缩,我将尝试回溯我们为使其工作所做的工作。有一些陷阱可能会让你试图让它工作(就我个人而言,我正在尽可能远离 WCF(。

首先,您需要安装 IIS 动态压缩。其次,您必须在 Silverlight 应用程序中使用浏览器 http(这是浏览器中的默认设置,但在运行 OOB 时则不然(,因为内置的 http 堆栈不支持 GZip 压缩。您可以在 Application_Startup(( 函数中强制执行此操作(如果需要,将 http 更改为 https(。

WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.BrowserHttp);

这里的问题是,只有当 Web 服务调用失败时,您才会在客户端中收到一般错误,因为浏览器堆栈不会将 http 500 响应的内容传递给 Silverlight。这对您来说是一个问题,可以使用自定义 MessageInspector 来解决,该检查器始终将响应代码更改为 200。

在您的 web.config 中,您需要启用动态压缩

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />

最重要的是,您需要在 IIS 中注册 mime 类型,我们将其添加到具有二进制消息编码的 WCF 应用程序 Host.config 中。

<add mimeType="application/soap+msbin1" enabled="true" />

如果您不使用二进制消息编码,则可能需要应用程序/soap+xml。如果我没记错的话,这些是所需的所有步骤。

最后一个问题是,当您的客户端发送大型消息时,它无济于事,因为无法(afaik(使Silverlight实际向服务器发送gzip压缩请求,因此您唯一的收益将是服务器发送的数据。

有几个选项可用于通过 HTTP 使用 WCF 进行压缩。每种方法都有其优点和缺点。

IIS 动态压缩

这是 HTTP 层上的压缩,并且性能最高,因为它在最低级别运行。它也是最标准的,因此可以轻松地与其他Web技术一起使用。

不幸的是,主要缺点是它基于旧的Web技术(HTTP(,其中人们认为上游数据是有限的,只有下游有效载荷值得压缩。因此,不会压缩上游数据。

消息压缩

从 .net 4.5 开始,消息编码器在 MessageEncoder 上具有一个新属性,可用于启用压缩。这是在 .net 层上完成的,因此比 IIS 压缩慢得多。它也是专有的,因此很难与非点网技术一起使用。这项技术不适用于SilverLight。

最新更新