我有一个asp.net webservice。此Web服务的一些功能是首先解压缩客户端请求。为此我写了2个方法,一个使用 MemoryStream ,其他使用 FileStream 。
使用 MemoryStream 时,会出现 OutofMemoryException 。所以我计划使用FileStream而不是MemoryStream。
在使用之前我只需要澄清我正在做的事情 正确的工作。
N:B:有些人我的客户会将 10MB + 数据发送到我需要在网络服务端解压缩的网络服务。我有更多 200个客户端正在运行。虽然我的网络服务在不同的应用程序池下,但是托管web服务的地方还有更多 30 web应用程序和webservice。
我确实看到了:GZIP decompression C# OutOfMemory
我从那里得到一些知识,但对于网络服务哪一个应该更好我根据我的情况很混乱。我需要清楚地了解这一点。
解压缩方法(使用MemoryStream)如下:
public static string Decompress(string compressedText)
{
try
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
catch (Exception ex)
{
DataSyncLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.ToString()+" : "+ex.StackTrace);
}
return string.Empty;
}
解压缩方法(使用FileStream)如下:
public static string Decompress(string compressedText)
{
string SourceDirectory = System.Guid.NewGuid().ToString();
string DestinationDirectory = System.Guid.NewGuid().ToString();
try
{
File.WriteAllBytes(SourceDirectory, Convert.FromBase64String(compressedText));
using (FileStream fd = File.Create(DestinationDirectory))
{
using (FileStream fs = File.OpenRead(SourceDirectory))
{
fs.Seek(4, 0);
using (Stream csStream = new GZipStream(fs, CompressionMode.Decompress))
{
byte[] buffer = new byte[1024];
int nRead;
while ((nRead = csStream.Read(buffer, 0, buffer.Length)) > 0)
{
fd.Write(buffer, 0, nRead);
}
}
}
}
return Encoding.UTF8.GetString(File.ReadAllBytes(DestinationDirectory));
}
catch (Exception ex)
{
DataSyncLog.Debug(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "::" + System.Reflection.MethodBase.GetCurrentMethod().ToString() + ":" + ex.ToString() + " : " + ex.StackTrace);
return string.Empty;
}
finally
{
ClearFiles(SourceDirectory);
ClearFiles(DestinationDirectory);
}
}
有人可以告诉我哪个方向正确 我应该使用或使用的方法所需的任何修改 MemoryStream可以克服这个错误。我将感激你 如果你让我清楚地了解这个或任何代码更改 建议。
答案 0 :(得分:1)
在第二种情况下使用流看起来更有效:使用内存流将整个流保存在内存中,文件流只有大小有限的缓冲区。
由于它们的签名,你的两个方法都可能出现内存问题:当客户端发送10MB时,这个内存量将分配给compressedText参数和返回值。
您可以查看更改服务的界面,以便以块的形式传输数据(此处您可以找到类似方法的示例 - http://www.codeproject.com/Articles/43272/Uploading-Large-Files-Through-Web-Service)
或者,如果您可以考虑切换到WCF,它支持流式传输模式 - http://msdn.microsoft.com/en-us/library/ms751463.aspx