C# 有人知道我为什么收到HttpWebRequest超时吗?

C# 有人知道我为什么收到HttpWebRequest超时吗?,c#,timeout,httprequest,freeze,C#,Timeout,Httprequest,Freeze,我想知道你是否能帮我解决我的一个问题。我创建了一个HTTP管理器,可以帮助我处理从网站发布/获取数据。直到最近,当我尝试将两者混合使用时,它一直运行良好。第一个循环循环一切正常,第二个循环挂起HttpWebRequest.GetRequestStream()。我在网上读了很多书,没有找到真正的解决办法。以下是用于获取/接收的代码块: ASCIIEncoding encoding = new ASCIIEncoding(); byte[] buffer = encoding.GetBytes(

我想知道你是否能帮我解决我的一个问题。我创建了一个HTTP管理器,可以帮助我处理从网站发布/获取数据。直到最近,当我尝试将两者混合使用时,它一直运行良好。第一个循环循环一切正常,第二个循环挂起HttpWebRequest.GetRequestStream()。我在网上读了很多书,没有找到真正的解决办法。以下是用于获取/接收的代码块:

 ASCIIEncoding encoding = new ASCIIEncoding();
 byte[] buffer = encoding.GetBytes(_PostData);

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl);
_HttpWebRequest.Credentials = _Credentials;
_HttpWebRequest.Method = _RequestType.ToString();
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded";
_HttpWebRequest.ContentLength = buffer.Length;
_HttpWebRequest.UserAgent = userAgent;
_HttpWebRequest.CookieContainer = _CookieContainer;
_HttpWebRequest.KeepAlive = false;
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect;
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
_HttpWebRequest.ServicePoint.Expect100Continue = false;  

 if (_RequestType.Equals(RequestTypes.POST))
{
     // Write POST
 Stream reqStream = _HttpWebRequest.GetRequestStream();
 {
  reqStream.Write(buffer, 0, buffer.Length);
  reqStream.Flush();
  reqStream.Close();
    }
}
以及回应:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse();
{
  Stream responseStream = httpWebResponse.GetResponseStream();
  {
    if (_UseGzip)
    {
      if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
      {
        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
      }
      else
      {
        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
      }
    }

    if (responseStream != null)
    {
      StreamReader streamReader = new StreamReader(responseStream);
      {
        try
        {
          _PageContent = streamReader.ReadToEnd();
        }
        finally
        {
          streamReader.Close();
          responseStream.Close();
          httpWebResponse.Close();
        }
      }
    }
    else
    {
      _PageContent = string.Empty;
    }
  }
}
_HttpWebRequest.Abort();

有人能看出我的代码挂起的原因吗?所有流都已关闭,我已将允许的连接设置为100多个,我不明白为什么会断开连接。

这可能是因为您没有处理WebResponse、流或流阅读器:

var request = WebRequest.Create(...);
using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(responseStream))
        {
            // use the reader
        }
    }
}

我也有同样的问题。我使用这些块正确地关闭(处理)了所有流和HttpWebResponse。当我垃圾邮件发送请求时,问题仍然存在,其中被ThreadAbortExceptions中止。最后,当ThreadAbortException发生时,它帮助调用myWebRequest.Abort()!希望这有帮助。

我看到您使用:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
除手动减压方法外:

      if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
      {
        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
      }
      else
      {
        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
      }
如果这真的很重要,我没有尝试,但我只使用手动方法和类似的代码,而且效果很好。事实上,我有一个悬而未决的问题,但只有一个域,对属性的实验显示了差异


哦,我怀疑如果你不使用任何后期数据压缩,你需要删除内容编码头

你是否尝试过使用Wireshark之类的工具来查看实际发送的数据?当你说代码第一次工作但第二次停止时,在相应的请求期间,您使用了哪些http方法?代码挂在一个帖子上,GET似乎工作正常。当我通过burp代理运行代码时,出于某种原因,它工作正常吗?也许代理正在修复我的一些标题,因为我不明白这会有什么不同。试试John的回答,我遇到了与您类似的问题。处置资源解决了我的问题。我正在中止请求(没有可用的dispose方法),并关闭所有可用的流。我还尝试将所有对象设置为null,然后在每个请求结束时调用GC来处理它们,这也没有任何影响。@Paul:您还需要处理
StreamReader
,因为它实现了
IDisposable
。与
流相同,如果引发异常,则不会关闭该流。这就是
使用
块为您所做的。无论发生什么情况,它都确保其参数已被释放。当我听说您的代码在随后的尝试中失败时,我想知道,“他在上一次尝试中没有做什么”。很多时候,答案是“有些东西没有处理掉”。