我有一个访问WCF web服务的Silverlight 2 Beta 2的应用。 正因为如此,它目前只能使用basicHttp结合。 该Web服务将返回相当大量的XML数据。 这似乎从一个带宽使用率的角度来看相当浪费作为响应,如拉链,将是5倍小(其实我粘贴的响应转换成txt文件,并拉上了。)。
请求确有“接受编码:gzip,紧缩” - 有什么办法有WCF服务的gzip(或者压缩)的反应如何?
我也发现这个链接 ,但它肯定似乎是一个功能有点复杂应处理外的现成恕我直言。
行 - 起初我打上使用System.IO.Compression作为答案,因为我永远无法“似乎”让IIS7的动态压缩工作的解决方案。 好吧,事实证明:
在IIS7动态压缩沿着工作人。 这只是Nikhil的IE浏览器的Web开发助手插件并没有表现出来的工作。 我的猜测是,由于SL手中的Web服务调用关闭浏览器,该浏览器处理它“在幕后”和Nikhil的工具,从来没有看到压缩的响应。 我能够通过使用招其监控流量外部浏览器应用程序,以确认这一点。 在小提琴手的响应,事实上,gzip压缩!
另一个问题与System.IO.Compression解决方案是System.IO.Compression不Silverlight的CLR存在。
所以从我的角度来看,最简单的方法,以使在Silverlight WCF压缩是为了让IIS7中动态压缩,并在所有写任何代码。
如果你正在使用IIS7,看看在压缩模块 。 这允许您为HTTP请求到服务器配置压缩。
WS-压缩为WCF允许您在绑定配置压缩。
见WS-压缩为WCF巴勃罗·M. Cibraro
或者,尝试微软的GZip编码器的采样其中“创建一个使用System.IO.Compression.GZipStream类来压缩输出WCF消息的编码器的信道”
我没有看到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;
}
}
然后我只是我的服务采取的字节数组作为输入,像这样的
void ReceiveData(byte[] data);
制定了适合我。
还应该注意的是,你可能需要的MIME类型添加到applicationHost.config
下<httpCompression><dynamicTypes>
除了部分使压缩的网站:
<add mimeType="application/soap+msbin1" enabled="true" />
如果某些动态响应不被压缩(有的),它可能是一个MIME类型的问题。 使用Fiddler获得与请求相关的细节。 失败请求跟踪可以是决定IIS是否被甚至试图压缩响应是有用的。 如果压缩配置正确,你会看到一个NO_MATCHING_CONTENT_TYPE
在跟踪输出的完整的曲线部分。