Кто-нибудь знает, почему я получаю тайм-аут HttpWebRequest? - PullRequest
10 голосов
/ 11 февраля 2010

Мне было интересно, можете ли вы помочь мне с ошибкой, которая у меня есть.У меня есть менеджер 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();
    }
}

И ответ:

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, я не понимаю, почему это разрыв.

Ответы [ 3 ]

11 голосов
/ 21 февраля 2010

Это может быть связано с тем, что вы не утилизируете свой WebResponse или потоки или StreamReaders:

var request = WebRequest.Create(...);
using (var response = request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(responseStream))
        {
            // use the reader
        }
    }
}
2 голосов
/ 22 июня 2011

У меня была такая же проблема. Я закрыл (удалил) все потоки и HttpWebRespsese правильно с этими, используя блоки. Проблема все еще сохранялась, когда я спамил запросы, которые были прерваны ThreadAbortExceptions. Наконец, это помогло вызвать myWebRequest.Abort (), когда возникла исключительная ситуация ThreadAbortException! Надеюсь, это поможет.

0 голосов
/ 27 ноября 2013

Я вижу, что вы используете:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;

Наряду с подходом ручной декомпрессии:

      if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
      {
        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
      }
      else
      {
        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
      }

Не пытался, если это действительно имеет значение, но я использую только ручной подход и в похожем коде, и он отлично работает. На самом деле у меня есть проблемы с зависанием, но только с одним доменом, эксперименты со свойствами показали разницу.

О, и я подозреваю, что если вы не используете сжатие данных после публикации, вам нужно удалить заголовок кодировки содержимого

...