Проверьте, работает ли URI - PullRequest
0 голосов
/ 15 октября 2010

Я пытаюсь создать простое приложение, которое будет "пинговать" URI и сообщать мне, отвечает ли он или нет

У меня есть следующий код, но кажется, что он проверяет домены только на корневом уровне

т.е. www.google.com, а не www.google.com/voice

private bool WebsiteUp(string path)
    {

        bool status = false;

        try
        {
            Uri uri = new Uri(path);
            WebRequest request = WebRequest.Create(uri);
            request.Timeout = 3000;
            WebResponse response;
            response = request.GetResponse();
            if (response.Headers != null) 
            {
                status = true;
            }

        }
        catch (Exception loi) 
        {
            return false;
        }


        return status;
    }

Существует ли какой-либо существующий код, который бы лучше соответствовал этой потребности?

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Редактировать: На самом деле, я говорю неправду - по умолчанию 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 успешными.

1 голос
/ 15 октября 2010

Для этого можно использовать класс Ping, более подробную информацию можно найти здесь: http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

0 голосов
/ 15 октября 2010

Я сделал нечто подобное, когда написал торрент-клиент для проверки действительных URL-адресов трекера, почти уверен, что нашел ответ на SO, но, похоже, не могу его найти, вот пример кода, который я получил из этого поста.

   using(var client = new WebClient()) { 
        client.HeadOnly = true; 
        // exists
        string Address1 = client.DownloadString("http://google.com"); 
        // doesnt exist - 404 error
        string Address2 = client.DownloadString("http://google.com/sdfsddsf"); 
    } 
...