Кто-нибудь знает, почему я получаю HttpWebRequest Timeout?
Мне было интересно, можете ли вы помочь мне с ошибкой, с которой я сталкиваюсь. У меня есть менеджер 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, я не понимаю, почему это ломается.
Ответы
Ответ 1
Это может быть связано с тем, что вы не используете свои 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
У меня была та же проблема. Я закрыл (удалил) все потоки и HttpWebResponse правильно с помощью этих блоков. Проблема по-прежнему сохранялась, когда я спамевал запросы, в которых прерывается ThreadAbortExceptions. Наконец, это помогло вызвать myWebRequest.Abort() при возникновении ThreadAbortException! Надеюсь, это поможет.
Ответ 3
Я вижу, что вы используете:
HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
Наряду с ручным декомпрессионным подходом:
if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
else
{
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
}
Не пыталась, если это действительно имеет значение, но я использую только ручной подход и в подобном коде, и он отлично работает. На самом деле у меня проблема с зависанием, но только с одним доменом эксперимент со свойствами показал разницу.
О, и я подозреваю, что если вы не используете какое-либо пост-сжатие данных, вам нужно удалить заголовок кодировки контента