使IIS gzip压缩与.NET 4.0上的Silverlight WCF服务一起工作

使IIS gzip压缩与.NET 4.0上的Silverlight WCF服务一起工作,wcf,wcf-binding,Wcf,Wcf Binding,我有一个Silverlight项目,通过WCF web服务从IIS 7.0服务器获取数据。返回的数据通常很大,因此压缩似乎是一个不错的选择。然而,就我个人而言,我无法让它发挥作用 这是我到目前为止试过的 为所有mime类型(/)启用压缩(动态和静态)。已验证它是否有效(点击aspx页面会按照fiddler返回Gzip数据) 在WCF和压缩方面做了大量的挖掘。我读到了一些类似WCF4.5的东西,其中有一些东西可以启用/禁用gzip。我不确定这是否意味着不能使用IIS7.0动态压缩,或者这是否是无

我有一个Silverlight项目,通过WCF web服务从IIS 7.0服务器获取数据。返回的数据通常很大,因此压缩似乎是一个不错的选择。然而,就我个人而言,我无法让它发挥作用

这是我到目前为止试过的

  • 为所有mime类型(/)启用压缩(动态和静态)。已验证它是否有效(点击aspx页面会按照fiddler返回Gzip数据)
  • 在WCF和压缩方面做了大量的挖掘。我读到了一些类似WCF4.5的东西,其中有一些东西可以启用/禁用gzip。我不确定这是否意味着不能使用IIS7.0动态压缩,或者这是否是无关的
  • 还获得了一些使用GZipEncoder的示例(来自Microsoft WCF示例)
这是我想知道的

  • 使用Silverlight从承载在IIS 7.0服务器上的WCF读取数据 使用.NET4.0,是否可以打开XML的压缩 通过简单地摆弄Web.Config来响应/ applicationHost.Config
  • 如果没有,最简单的方法是什么(比如,添加一个dll,更改我的Web.Config并完成!)
谢谢大家


编辑:谢谢大家的回答。只要一个简短的提示-如果有人能确认它不适用于WCF 4.0“或”只有在您这样做的情况下才适用于WCF 4.0,这会有所帮助。

使用WCF over HTTP进行压缩有几个选项。各有利弊

IIS动态压缩

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
这是HTTP层上的压缩,性能最好,因为它在最低级别运行。它也是最标准的,因此可以轻松地与其他web技术配合使用

不幸的是,它的主要缺点是基于旧的web技术(HTTP),其中有一个旧的信念,即上游数据是有限的,只有下游负载值得压缩。因此上游数据不会被压缩

消息压缩

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

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

我们已经为WCF提供了GZip压缩,我将尝试追溯我们为使其工作所做的工作。如果你想让它发挥作用,可能会遇到一些棘手的问题(就我个人而言,我正在尽可能远离WCF)

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

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

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

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

除此之外,您还需要在IIS中注册mime类型,我们使用二进制消息编码将其添加到WCF的applicationHost.config中

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

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


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

您是否仅限于使用HTTP?抱歉,我没有完全理解您的问题。HTTP vs?。如果这是一个问题,那么站点和WCF托管在https URL上。谢谢您有一个到HTTP的替代绑定。其中之一是使用二进制编码器的TCP。在消息大小方面,二进制编码器比文本编码器(XML)更好。Silverlight 4支持NetTcpBinding的一个子集。它不支持TLS(据我所知),所以如果您需要点对点安全性,这可能是一个问题。安全性是我在尝试进行二进制编码时遇到的问题:-(。但是感谢您的评论-至少这是一件我不必再次尝试的事情:-)抱歉,我有点被.NET 4.0卡住了。单向压缩可以。我只需要压缩服务器到客户端的数据(我假设这就是您所说的下游)。只需更改IIS设置或Web.Config就可以实现这一点(站点和WCF托管在https上)吗?不,您不能只在
Web.Config
上进行设置。有几个零件需要从高处接近机器。首先,您需要安装
IIS动态压缩
(您的测试仅证明您已安装
IIS静态压缩
)。然后,您必须添加mime类型,就像您所做的那样。最后,您需要确保您的CPU永远不会达到90%,因为这会自动关闭压缩。很抱歉,我没有提到这一点-我还安装了动态压缩,我通过检查aspx文件生成的动态内容是否正在gzip(通过Fiddler)来验证它是否正常工作。我通过调整application.config删除了CPU限制。但它仍然不起作用(使用WCF 4.0)您是否将WCF设置为缓冲模式?是否安装了动态压缩(实际上更进一步-确保对aspx生成的动态内容进行压缩)。它在浏览器中是silverlight,所以我希望不需要RegisterPrefix。是的,还有do…Compression标签和mimeTypes。不,没有太多的p