Редактировать: На самом деле, я говорю неправду - по умолчанию 404 в любом случае должен вызывать веб-исключение, и я только что подтвердил это на случай, если я запомнил. Хотя код, приведенный в примере, является утечкой, он все равно должен работать. Удивительно, но я оставлю этот ответ здесь для большей безопасности с объектом ответа.
Проблема с кодом, который у вас есть, заключается в том, что, хотя он действительно проверяет точный заданный URI, он считает 404, 500, 200 и т. Д. Одинаково «успешными». Также немного расточительно использовать GET для выполнения работы, для которой HEAD достаточно. Это действительно должно очистить этот WebResponse тоже. И термин path
- это глупое имя параметра для чего-то, что не просто путь, пока мы на нем.
private bool WebsiteUp(string uri)
{
try
{
WebRequest request = WebRequest.Create(uri);
request.Timeout = 3000;
request.Method = "HEAD";
using(WebResponse response = request.GetResponse())
{
HttpWebResponse hRes = response as HttpWebResponse;
if(hRes == null)
throw new ArgumentException("Not an HTTP or HTTPS request"); // you may want to have this specifically handle e.g. FTP, but I'm just throwing an exception for now.
return hRes.StatusCode / 100 == 2;
}
}
catch (WebException)
{
return false;
}
}
Конечно, есть плохие сайты, которые возвращают 200 постоянно и так далее, но это лучшее, что можно сделать. Предполагается, что в случае перенаправления вы заботитесь о конечной цели перенаправления (в конечном итоге вы попали на успешную страницу или страницу с ошибкой), но если вам небезразличен конкретный URI, вы можете отключить автоматическое перенаправление после, и считайте коды 3xx успешными.