Обнаружить 404 без ловли исключений - PullRequest
4 голосов
/ 28 октября 2010

Простая функция: проверьте, возвращает ли веб-сервер состояние HTTP, отличное от 200.

Private Function RemoteFileOk(ByVal Url As String) As Boolean
  Dim req As HttpWebRequest = TryCast(WebRequest.Create(Url), HttpWebRequest)
  req.Method = "HEAD"
  Dim rsp As HttpWebResponse = TryCast(req.GetResponse(), HttpWebResponse)
  Return (rsp.StatusCode = HttpStatusCode.OK)
End Function

Я получил его от этого ответа на " Как проверить, выходит ли файл на веб-сервере по его URL-адресу? ".

К сожалению, это не работает: выдается исключение System.Net.WebException: «Удаленный сервер возвратил ошибку: (404) Не найдено», когда URL-адрес указывает на несуществующую страницу.Я хотел бы иметь возможность проверить сервер с запросом HEAD (или что-то подобное), а затем иметь дело с 404 без необходимости перехвата исключений.

Мое исправление выглядит так:

Private Function RemoteFileOk(ByVal Url As String) As Boolean
  Dim req As HttpWebRequest = TryCast(WebRequest.Create(Url), HttpWebRequest)
  req.Method = "HEAD"
  Try
    Using rsp As HttpWebResponse = TryCast(req.GetResponse(), HttpWebResponse)
      Return (rsp.StatusCode = HttpStatusCode.OK)
    End Using
  Catch ex As WebException
    Return False
  End Try
End Function

Но мне никогда не нравилось использовать операторы try-catch, когда кажется, что их можно избежать.

Есть ли другой, более аккуратный способ?

1 Ответ

0 голосов
/ 09 апреля 2013

Вы можете обновить свой код, чтобы использовать новый System.Net.Http API в .net 4.5, который не вызывает этого неприятного исключения (см. Комментарии к вопросу).Протестировано для работы под VS 2012u2.

Private Function RemoteFileOk(ByVal Url As String) As Boolean
    Using client As New HttpClient,
        responseTask As Task(Of HttpResponseMessage) = client.GetAsync(Url, HttpCompletionOption.ResponseHeadersRead)
        responseTask.Wait()
        Using response As HttpResponseMessage = responseTask.Result
            Return response.IsSuccessStatusCode
        End Using
    End Using
End Function

Этот ответ не был доступен, когда был задан вопрос, и для многих людей не является решением, поскольку этот API был введен в .net 4.5.

...