如何加快缓冲的WCF传输速度

时间:2014-05-22 03:09:37

标签: c# performance wcf nettcpbinding

我在WCF中使用Buffered transferMode方案将压缩文件从服务器传输到客户端。传输发生在回调中,3.7兆字节文件只需2分钟即可完成传输。 由于我有很多其他功能使用这种缓冲模式,我宁愿不改变方案。

这里参考我正在使用的绑定

<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_MyIIService"
      closeTimeout="00:01:00"
      openTimeout="00:01:00"
      receiveTimeout="00:10:00"
      sendTimeout="00:01:00"
      transactionFlow="false"
      transferMode="Buffered"
      transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard"
      listenBacklog="10"
      maxBufferPoolSize="4967294"
      maxBufferSize="4967294"
      maxConnections="10"
      maxReceivedMessageSize="104857600">
      <readerQuotas maxDepth="104857600"
             maxStringContentLength="104857600"
             maxArrayLength="104857600"
             maxBytesPerRead="104857600"
             maxNameTableCharCount="104857600"/>
      <reliableSession ordered="true"
             inactivityTimeout="20:00:10"
             enabled="true"/>
      <security mode="None">
        <transport clientCredentialType="Windows"
             protectionLevel="EncryptAndSign"/>
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings> 

我已经为尺寸做了很多不同的变化,除非设置得很小,否则看起来并不重要。

在服务器上的回调中,我使用以下代码片段将二进制(zip)文件发送到客户端。在这里,我使用Base64编码将zip文件转换为ASCII。 (顺便说一下,将zip文件作为二进制文件传输的时间相同但到达时已损坏)

byte[] binaryData;
System.IO.FileStream inFile;
inFile = new System.IO.FileStream(path2ZipFile,
             System.IO.FileMode.Open,
             System.IO.FileAccess.Read);
binaryData = new Byte[inFile.Length];
            long bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length);
inFile.Close();
string convertedToBase64 = System.Convert.ToBase64String(binaryData, 0,
                           binaryData.Length);
handler(guest, zipFilename, convertedToBase64);

将文件放入Google云端硬盘共享大约需要15秒。那么这是什么一回事。如何提高转移率?

1 个答案:

答案 0 :(得分:2)

我已经尝试了其他一切,你可以给予压缩。简而言之,压缩主机端的数据需要1/2秒,客户端需要1/2秒才能解压缩,但是通过线路发送的总有效负载减少了大约1/3。

您可以在使用System.Convert.ToBase64String将其更改为字符串之前压缩byte()数组,也可以在发送之前压缩base64字符串。这是C#的一个小压缩/解压缩类:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace CompressString
{
internal static class StringCompressor
{
    /// <summary>
    /// Compresses the string.
    /// </summary>
    /// <param name="text">The text.</param>
    /// <returns></returns>
    public static string CompressString(string text)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        var memoryStream = new MemoryStream();
        using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
        {
            gZipStream.Write(buffer, 0, buffer.Length);
        }

        memoryStream.Position = 0;

        var compressedData = new byte[memoryStream.Length];
        memoryStream.Read(compressedData, 0, compressedData.Length);

        var gZipBuffer = new byte[compressedData.Length + 4];
        Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
        Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
        return Convert.ToBase64String(gZipBuffer);
    }

    /// <summary>
    /// Decompresses the string.
    /// </summary>
    /// <param name="compressedText">The compressed text.</param>
    /// <returns></returns>
    public static string DecompressString(string compressedText)
    {
        byte[] gZipBuffer = Convert.FromBase64String(compressedText);
        using (var memoryStream = new MemoryStream())
        {
            int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
            memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);

            var buffer = new byte[dataLength];

            memoryStream.Position = 0;
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                gZipStream.Read(buffer, 0, buffer.Length);
            }

            return Encoding.UTF8.GetString(buffer);
        }
    }
}
}
祝你好运。我发现这个压缩实用程序快速且易于使用。当然,只有在两端都使用.NET时,此代码才有效。如果您有iOS或Android客户端,则需要使用操作系统中立的压缩实用程序。