【问题标题】:Detect 404 without catching exceptions在不捕获异常的情况下检测 404
【发布时间】:2011-05-01 16:36:41
【问题描述】:

简单功能:检查网络服务器是否返回非 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

我从“How to check if a file exits on an webserver by its URL?”上的this answer 得到它。

不幸的是,它不起作用:当 url 指向不存在的页面时,抛出 System.Net.WebException,“远程服务器返回错误:(404) Not Found”。我希望能够用 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 语句,因为它们似乎可以避免。

还有其他更简洁的方法吗?

【问题讨论】:

  • 似乎异常适用于 404,因为除了抛出错误页面之外,Web 服务器无法“处理”它。为什么你认为这里的异常不好?
  • 没错。正要输入。
  • 这个答案说这是那些“令人烦恼的例外”之一:stackoverflow.com/questions/1366848/…
  • @Robert 和@RPM1984:我不认为远程服务器上丢失的文件如此特别以至于它会导致我的代码出现异常。 :) 异常(并捕获它)会带来很小的性能损失,并且会不必要地使代码混乱。因此,如果 .NET 框架中的某个地方隐藏了一些东西,可以在不求助于异常处理的情况下解决这个常见任务,我基本上只是好奇。
  • @Ani:感谢您的链接,这是一篇不错的文章 (blogs.msdn.com/b/ericlippert/archive/2008/09/10/…),我同意 Eric Lipperts 的观点。而且我实际上认为 404 在某种程度上属于“愚蠢”类别,尽管远程服务器上的内容不在我的控制范围内。

标签: .net vb.net exception-handling httpwebrequest http-status-code-404


【解决方案1】:

您可以更新您的代码以使用 .net 4.5 中的新 System.Net.Http API,它不会引发这个令人烦恼的异常(请参阅问题的 cmets)。经测试可在 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 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2014-04-12
    • 1970-01-01
    • 2012-03-04
    • 2021-06-05
    相关资源
    最近更新 更多