代码之家  ›  专栏  ›  技术社区  ›  Jakob Gade

在不捕获异常的情况下检测404

  •  4
  • Jakob Gade  · 技术社区  · 14 年前

    简单功能:检查Web服务器是否返回非200 HTTP状态。

    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
    

    我是从 this answer 在“上” How to check if a file exits on an webserver by its URL? ".

    不幸的是,它不起作用:一个系统。网当抛出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
    

    能够 必须避免。

    还有更整洁的方式吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   binki    11 年前

    您可以更新代码以使用新系统。网Http API在中。NET4.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是在年引入的。净4.5。