我在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秒。那么这是什么一回事。如何提高转移率?
答案 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客户端,则需要使用操作系统中立的压缩实用程序。