2

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

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

  • 为所有 mime 类型 ( / )启用压缩(动态和静态)。已验证它是否有效(按 fiddler 对 aspx 页面的点击会返回 gzip 压缩的数据)
  • 在 WCF 和压缩方面做了很多研究。我读了一些关于 WCF 4.5 的东西,有一些东西可以启用/禁用 gzip。我不确定这是否意味着不能使用 IIS 7.0 动态压缩,或者它是否无关。
  • 还有一些关于使用 GZipEncoder 的示例(来自 Microsoft WCF 示例)

这就是我想知道的

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

谢谢各位!

编辑:感谢所有回答的人。只是一个简短的说明-如果有人可以确认它不适用于 WCF 4.0“或”仅当您这样做时才适用于 WCF 4.0,那会有所帮助。

4

2 回答 2

1

我们已经让 GZip 压缩适用于 WCF,我将尝试回溯我们为使其正常工作所做的工作。有一些陷阱可能会咬你试图让它工作(我个人正在尝试尽可能远离 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 类型,我们将其添加到 applicationHost.config 中,用于带有二进制消息编码的 WCF。

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

如果你不使用二进制消息编码,你可能需要 application/soap+xml 代替这里。如果我没记错的话,这些都是所需的步骤。

最后一个问题是,当您的客户端发送大消息时它没有帮助,因为没有办法(afaik)让 silverlight 实际上向服务器发送 gzip 压缩请求,所以您唯一的收获将是服务器发送的数据.

于 2013-10-15T14:08:58.987 回答
0

使用 WCF over HTTP 进行压缩有多种选择。每个都有其优点和缺点。

IIS 动态压缩

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

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

消息压缩

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

于 2013-10-12T13:35:48.267 回答