在Silverlight中向WCF添加压缩的最简单方法是什么?
我有一个silverlight 2 beta 2应用程序,可以访问WCF web服务。因此,它目前只能使用basicHttp绑定。Web服务将返回相当大量的XML数据。从带宽使用的角度来看,这似乎是相当浪费的,因为响应如果压缩,会小5倍(实际上我将响应粘贴到一个txt文件中并压缩) 请求确实有“Accept Encoding:gzip,deflate”-WCF服务gzip(或压缩)响应有什么方法吗 我确实发现了这一点,但对于应该开箱即用的IMHO来说,这似乎有点复杂 好的-首先,我用System.IO.Compression作为答案标记解决方案,因为我“似乎”永远无法让IIS7动态压缩工作。事实证明:在Silverlight中向WCF添加压缩的最简单方法是什么?,wcf,silverlight,compression,gzip,Wcf,Silverlight,Compression,Gzip,我有一个silverlight 2 beta 2应用程序,可以访问WCF web服务。因此,它目前只能使用basicHttp绑定。Web服务将返回相当大量的XML数据。从带宽使用的角度来看,这似乎是相当浪费的,因为响应如果压缩,会小5倍(实际上我将响应粘贴到一个txt文件中并压缩) 请求确实有“Accept Encoding:gzip,deflate”-WCF服务gzip(或压缩)响应有什么方法吗 我确实发现了这一点,但对于应该开箱即用的IMHO来说,这似乎有点复杂 好的-首先,我用System
因此,从我的角度来看,在Silverlight中启用WCF压缩的最简单方法是在IIS7中启用动态压缩,而不编写任何代码。最近在执行WCF项目时,我没有看到WCF进行压缩的本机方法。我只是使用了System.IO.Compression名称空间并制作了一个快速压缩器。这是我使用的代码
public static class CompressedSerializer
{
/// <summary>
/// Decompresses the specified compressed data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="compressedData">The compressed data.</param>
/// <returns></returns>
public static T Decompress<T>(byte[] compressedData) where T : class
{
T result = null;
using (MemoryStream memory = new MemoryStream())
{
memory.Write(compressedData, 0, compressedData.Length);
memory.Position = 0L;
using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
{
zip.Flush();
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
result = formatter.Deserialize(zip) as T;
}
}
return result;
}
/// <summary>
/// Compresses the specified data.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] Compress<T>(T data)
{
byte[] result = null;
using (MemoryStream memory = new MemoryStream())
{
using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
{
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(zip, data);
}
result = memory.ToArray();
}
return result;
}
}
对我来说很好 如果您正在使用IIS7,请查看。这允许您为发送到服务器的HTTP请求配置压缩。WS-compression for WCF允许您在绑定上配置压缩 见Pablo M.Cibraro
或者,尝试Microsofts,它“创建一个使用System.IO.Compression.Gzip流类压缩传出WCF消息的编码器通道”还应注意,除了为站点启用压缩之外,您可能还需要将mime类型添加到
部分下的applicationHost.config
:
<add mimeType="application/soap+msbin1" enabled="true" />
如果某些动态响应没有被压缩(有些是),则可能是mime类型的问题。使用Fiddler获取与请求相关的细节。失败的请求跟踪可能有助于确定IIS是否正在尝试压缩响应。如果压缩配置正确,您将在跟踪输出的完整跟踪部分中看到一个
无匹配内容类型
。一个警告是silverlight 2根本不支持WS绑定,只支持basicHttp绑定。这里有一些警告:我的工作代理删除accept gzip头(wtf,对吗?)。您只压缩发送到客户端的数据。请注意,在Silverlight 2 CLR中GZipStream不可用。DimeBrain在这里实现了SharpZipLib:这对我来说是成功的。但是,应该注意,您必须在C:\Windows\System32\inetsrv\config\applicationHost.config文件中设置此设置,因为web.config设置被忽略。动态压缩只适用于某些请求(即被IIS视为经常调用的请求)。所以这是一个很好的特性,但您无法控制它。当用户登录时,我有一个非常大的呼叫。但它每天都会发生一次。而且它没有被压缩。
<add mimeType="application/soap+msbin1" enabled="true" />