项目当中需要用到 GZipStream 解压缩。我先把我写的方法帖出来大家帮忙看一下。public static string Post(string Url, string RequestString, int TimeoutSeconds)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); if (TimeoutSeconds > 0)
{
request.Timeout = 1000 * TimeoutSeconds;
}
request.Method = "POST";
request.AllowAutoRedirect = true; byte[] data = System.Text.Encoding.GetEncoding("gb2312").GetBytes(RequestString); if ((RequestString.Length > 4096) || (RequestString.IndexOf("transType=106") > -1))
{
try
{
request.ContentType = "application/x-gzip";
request.Accept = "application/x-gzip";
GZipStream outstream = new GZipStream(request.GetRequestStream(), CompressionMode.Compress); outstream.Write(data, 0, data.Length);
outstream.Close();
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
else
{
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "";
Stream outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length);
outstream.Close();
} HttpWebResponse hwrp = (HttpWebResponse)request.GetResponse();
string ContentType = hwrp.Headers.Get("Content-Type"); StreamReader sr = null; if (ContentType.IndexOf("text/html") > -1)
{
sr = new StreamReader(hwrp.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
}
else
{
sr = new StreamReader(new GZipStream(hwrp.GetResponseStream(), CompressionMode.Decompress), System.Text.Encoding.GetEncoding("gb2312"));
} return sr.ReadToEnd();
}这个方法会出现一个非常奇怪的问题,当我和别人进行联调的时候发现这个方法前面两次压缩是正常的,当进行到第三次压缩的时候就会出现非常异常的错误,当程序进行第三次压缩的时候程序不再运行下去了,用 try 也不行。
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); if (TimeoutSeconds > 0)
{
request.Timeout = 1000 * TimeoutSeconds;
}
request.Method = "POST";
request.AllowAutoRedirect = true; byte[] data = System.Text.Encoding.GetEncoding("gb2312").GetBytes(RequestString); if ((RequestString.Length > 4096) || (RequestString.IndexOf("transType=106") > -1))
{
try
{
request.ContentType = "application/x-gzip";
request.Accept = "application/x-gzip";
GZipStream outstream = new GZipStream(request.GetRequestStream(), CompressionMode.Compress); outstream.Write(data, 0, data.Length);
outstream.Close();
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
else
{
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "";
Stream outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length);
outstream.Close();
} HttpWebResponse hwrp = (HttpWebResponse)request.GetResponse();
string ContentType = hwrp.Headers.Get("Content-Type"); StreamReader sr = null; if (ContentType.IndexOf("text/html") > -1)
{
sr = new StreamReader(hwrp.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
}
else
{
sr = new StreamReader(new GZipStream(hwrp.GetResponseStream(), CompressionMode.Decompress), System.Text.Encoding.GetEncoding("gb2312"));
} return sr.ReadToEnd();
}这个方法会出现一个非常奇怪的问题,当我和别人进行联调的时候发现这个方法前面两次压缩是正常的,当进行到第三次压缩的时候就会出现非常异常的错误,当程序进行第三次压缩的时候程序不再运行下去了,用 try 也不行。
就是这一句,当第三次运行到这一句的时候程序就不再运行下去。用 try 也没有错误出来。
GC.WaitForPendingFinalizers();
就是保证当前的Stream一定关闭并释放了句柄,否则句柄在没释放之前,如果你再次请求就处于锁死状态了。不但是request,所有stream都主动调用close一下。
在说有流关闭前调用Flush()方法GZipStream 是否会调用到非托管资源,如果访问频率较高,这地方需要互斥下
outstream.Flush();
outstream.Close();
GC.WaitForPendingFinalizers();
加了 GC.WaitForPendingFinalizers() 还是不行,还是出现同样的状态。