0

我正在做一些数据分块,并且在我的响应中发送二进制数据时看到了一个有趣的问题。我可以确认字节数组的长度低于我的数据限制 4 兆字节,但是当我收到消息时,它的总大小超过 4 兆字节。

对于下面的示例,我使用了最大的块大小,以便在仍然接收可用块的同时说明问题。

实际消息大小

服务端和客户端的二进制数据大小为 3,040,870(消息反序列化后)。但是,我还可以确认字节数组实际上小于 4 兆字节(这是通过实际复制消息中的二进制数据并将其粘贴到文本文件中来完成的)。

实际大小(以字节为单位)

那么,WCF 是否会导致这些问题,如果是,我能做些什么来防止它吗?如果不是,是什么导致了我这边的这种通货膨胀?

谢谢!

4

2 回答 2

3

byte[]在 SOAP 消息中发送 s 的常用方法是对数据进行base64 编码。这种编码比二进制编码多占用 33% 的空间,这几乎准确地解释了大小差异。

您可以稍微调整最大大小或块大小,以使最终结果在正确的范围内,或者使用另一种编码,例如MTOM来消除这 33% 的开销。

于 2013-08-22T13:13:11.283 回答
0

如果你被肥皂卡住了,你可以抵消 Tim S. 谈到的使用 .Net 中的 System.IO.Compression 库的缓冲区开销 - 在构建和发送肥皂消息之前,你首先要使用 compress 函数。

你会用这个压缩:

public static byte[] Compress(byte[] data)
{
    MemoryStream ms = new MemoryStream();
    DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress);
    ds.Write(data, 0, data.Length);
    ds.Flush();
    ds.Close();
    return ms.ToArray();
}

在接收端,您将使用它来解压缩:

public static byte[] Decompress(byte[] data)
{
    const int BUFFER_SIZE = 256;
    byte[] tempArray = new byte[BUFFER_SIZE];
    List<byte[]> tempList = new List<byte[]>();
    int count = 0;
    int length = 0;

    MemoryStream ms = new MemoryStream(data);
    DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress);

 while ((InlineAssignHelper(count, ds.Read(tempArray, 0, BUFFER_SIZE))) > 0) {
    if (count == BUFFER_SIZE) {
        tempList.Add(tempArray);
        tempArray = new byte[BUFFER_SIZE];
    } else {
        byte[] temp = new byte[count];
        Array.Copy(tempArray, 0, temp, 0, count);
        tempList.Add(temp);
    }
    length += count;
}

    byte[] retVal = new byte[length];

   count = 0;
   foreach (byte[] temp in tempList) {
        Array.Copy(temp, 0, retVal, count, temp.Length);
        count += temp.Length;
}

return retVal;
}
于 2013-08-23T14:12:41.383 回答