Исключение тайм-аута не происходит вовремя
Я написал следующий код, используя httpwebrequest(Timeout=2000) и webproxy
Следующий код всегда выдает исключение из-за неправильного URL ("ww.google.com")
Когда я запускаю программу, я получаю два вида исключений поочередно
1. Удаленный сервер возвратил ошибку: (404) Not Found (Web Exception)
=> Требуется менее 2000 мс, чтобы поймать это исключение
=> Эта обработка исключений нормальная.
,
2. Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время или подключенный хост не смог ответить (исключение Socket)
=> Требуется 25 секунд или больше, чтобы поймать это исключение
=> Я установил запрос на 2000 мс, но он не работает!!!!
Я хочу поймать исключения, если нет ответа в течение 2 секунд
Что я должен делать?
try
{
request = (HttpWebRequest)WebRequest.Create("https://ww.google.com");
request.Proxy = proxy;
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
request.Timeout = 2000;
response = (HttpWebResponse)request.GetResponse();
if ((response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect))
{
StreamReader sreader = new StreamReader(response.GetResponseStream(), Encoding.Default);
gethtml = sreader.ReadToEnd();
sreader.Close();
}
}
catch (Exception ex)
{
throw ex;
}
1 ответ
По иронии судьбы во время тестирования с неверным URL https://ww.google.com
ты случайно споткнулся о мину. Смотрите этот пост для деталей. Документация MSDN, упомянутая в этом посте, находится здесь. Обратите внимание, что WebRequest.Create
возвращает HttpWebRequest
,
По сути, это займет некоторое время, поскольку URL-адрес не сопоставлен с IP-адресом и, следовательно, не будет кэшироваться в цепочке, что требует полного поиска DNS каждый раз, когда вы обращаетесь к нему. На самом деле с этим ничего не поделаешь, если вы не используете свой собственный уровень кэширования DNS в клиенте, но, честно говоря, это больше проблем, чем стоит.