MemoryStream VS FileStream哪个更适合在Web服务中用于GZipStream解压缩?

时间:2013-10-03 12:24:26

标签: c# web-services stream compression gzipstream

我有一个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可以克服这个错误。我将感激你   如果你让我清楚地了解这个或任何代码更改   建议。

1 个答案:

答案 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