我有一个silverlight2beta2应用程序访问WCF网服务。为此,它目前只能使用basicHttp结合。该服务将回报相当大数额的XML数据。这似乎是相当浪费从一个带宽使用率的角度来看,作为响应,如果拉链,就可以通过较小的系数为5(实际上我贴的响应成txt文件和压缩。).

该请求不会有"Accept-Encoding:gzip,deflate"-是否有任何方式有WCF服务gzip(或无压缩)的反应?

我没有找到这个 链接 但它确实似乎有点复杂的功能,应该处理的框恕我直言。

确定-我首先标志着解决方案使用的系统。IO.压缩作为回答,因为我可能永远不会"看起来",以获得IIS7动态压缩工作。好了,因为事实证明:

  1. 动态压缩在IIS7 工作al沿。它只是Nikhil的网页开发人员助手的插件对于即没有显示出它的工作。我的猜测是由于SL手中的网服务电话关的浏览器,这浏览器处理"下面"和Nikhil的工具永远看不到压缩的响应。我能够确认这一点通过使用小提琴手,监督业务的外部浏览器应用程序。在小提琴手,响应,事实上,gzip compressed!!

  2. 其他问题的系统。IO.压缩的方案是,系统。IO.压不存在控CLR。

所以从我的角度来看,最简单的方法使WCF压缩在统启动态压缩在IIS7并没有写代码。

有帮助吗?

解决方案

如果您使用的是IIS7,看一看 压缩模块.这可以让你配置压缩HTTP请求到服务器。

其他提示

WS-压缩WCF允许配置压缩的结合。

看看 WS-压缩WCF 通过巴勃罗*M.Cibraro

或者,试图微软 GZip编码样本 其"创建一个编码的通道,使用的系统。IO.压缩。GZipStream类压缩出WCF消息"

我没有看到一个地方WCF做压缩的时候做WCF项目。我只是使用的系统。IO.压缩的名字空间和作出了快速的压缩机。这里的代码,我在使用

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类型的问题。使用小提琴手得到的具体情况相关的请求。失败的请求跟踪可能是有用的,在确定是否IIS甚至试图压缩的响应。如果压缩配置是否正确你将会看到一个 NO_MATCHING_CONTENT_TYPE完整的痕迹 部分的跟踪产出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top