.NET: проверить код статуса ответа на URL?

Какой простой способ в .NET проверить, какой код состояния веб-сервер отвечает на запрос GET?

Обратите внимание, что мне не требуется тело ответа. Фактически, если это возможно, следует запросить только заголовок. Сказав это, однако, если просить о том, чтобы тело ответа было опущено, значительно увеличивает сложность кода, получение тела будет в порядке.

Кроме того, я особенно заинтересован в ловле ВСЕ возможных соответствующих исключений (System.Net.WebException, System.IO.IOException, System.Net.Sockets.SocketException и т.д.), так как эта процедура будет выполняться тысячи раз в день.

Ответы

Ответ 1

public HttpStatusCode GetHeaders(string url)
    {
        HttpStatusCode result = default(HttpStatusCode);

        var request = HttpWebRequest.Create(url);
        request.Method = "HEAD";
        using (var response = request.GetResponse() as HttpWebResponse)
        {
            if (response != null)
            {
                result = response.StatusCode;
                response.Close();
            }
        }

        return result;
    }

Ответ 2

Используйте метод HTTP HEAD, который совпадает с GET, за исключением того, что он не возвращает тело:

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Method = "HEAD";
var response = (HttpWebResponse)request.GetResponse();

// status code...
response.StatusCode;

Из Раздел 9.4 RFC2616:

Метод HEAD идентичен методу GET за исключением того, что сервер НЕ ДОЛЖЕН возвращаться тело сообщения в ответе. метаинформация, содержащаяся в HTTP заголовки в ответ на запрос HEAD ДОЛЖНЫ быть идентичны информации отправлено в ответ на запрос GET. Этот метод может быть использован для получения метаинформация об объекте подразумевается просьбой без передача самого сущностного тела. Этот метод часто используется для тестирования гипертекстовые ссылки для действительности, доступности и недавних модификация.

Ответ 3

Я закончил с этим методом, который сочетает в себе ответ Ивана Ферича и поддержку надлежащих исключительных случаев:

public async Task<bool> IsAccessibleAsync (string url)
{
    if (url == null)
        throw new ArgumentNullException ("url");

    if (url.IndexOf (':') < 0)
        url = "http://" + url.TrimStart ('/');

    if (!Uri.IsWellFormedUriString (url, UriKind.Absolute))
        return false;

    var request = (HttpWebRequest) WebRequest.Create (url);
    request.Method = "HEAD";

    try
    {
        using (var response = await request.GetResponseAsync () as HttpWebResponse)
        {
            if (response != null && response.StatusCode == HttpStatusCode.OK)
                return true;

            return false;
        }
    }
    catch (WebException)
    {
        return false;
    }
}

Ответ 4

Если вы используете HttpWebRequest, это довольно легко:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
HttpStatusCode status = response.StatusCode;

Вы можете окружить это с помощью предложения catchet catch или посмотреть документы для WebRequest.Create и .GetResponse, чтобы узнать, какие исключения будут выбрасываться.