c# 使用 HttpWebRequest 建立巨大的内存

c# Huge memory build-up with HttpWebRequest

您好,我在使用 httpwebrequest 时遇到问题,当 运行 一个相当大的基于请求的程序时,会产生大量内存。唯一可能发生累积的地方是在发送请求后读回流,我将如何解决这个问题或更好地为此类事情设置限制?

我也有各种 (10-15) if 语句在响应主体中寻找各种东西但即将将它们更改为 switch 语句,尽管我怀疑它们会导致如此高的内存累积我认为它最好提一下他们。我的请求如下所示:

HttpWebResponse response = null;

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);


                request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0");
                request.Headers.Add("Upgrade-Insecure-Requests", @"1");
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 OPR/63.0.3368.88";


                response = (HttpWebResponse)request.GetResponse();

                string _responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();

            catch (WebException e)
            {

            }
            catch (UriFormatException p)
            {


            }

如您所见,我的流是通过 _responseData 回读的,然后我使用 .contains 来查看我要查找的内容是否存在。

  • 将 HttpWebRequest.AllowWriteStreamBuffering 设置为 false。
  • 配置 HttpWebResponse、Stream 和 StreamReader。
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.AllowWriteStreamBuffering = false;

                request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0");
                request.Headers.Add("Upgrade-Insecure-Requests", @"1");
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 OPR/63.0.3368.88";

                string _responseData;

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            _responseData = sr.ReadToEnd();
                        }
                    }
                }
            }
            catch (WebException e)
            {

            }
            catch (UriFormatException p)
            {

            }