有谁知道为什么我收到HttpWebRequest超时?

Pau*_*ham 10 c# timeout httprequest hang

我想知道你是否可以帮我解决我遇到的一个错误.我有一个我创建的HTTP管理器,可以帮助我处理来自网站的POSTing/GETing数据.直到最近,当我尝试使用两者的混合物时,它一直工作正常.第一个循环循环一切正常,在第二个循环上它挂起在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

和响应:

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();
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到我的代码挂起的任何缺陷吗?所有流都被关闭,我已经将允许的连接设置为超过100,我不明白为什么这会破坏.

Joh*_*ers 11

这可能是因为您没有丢弃WebResponse或流或StreamReader:

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

  • @Paul:你还需要处理`StreamReader`,因为它实现了`IDisposable`.与`Stream`相同,如果抛出异常,你就不会关闭它.这就是`using`块为你做的.无论如何,它确保其参数为Disposed.一旦我听到您的代码在后续尝试中失败,我就会想,"他在_previous_尝试中做了什么".很多时候,答案是,"某些东西没有得到Dispose'd". (2认同)