.net - 检测 404 而不捕获异常

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

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

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

还有另一种更整洁的方法吗?

最佳答案

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

关于.net - 检测 404 而不捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039881/

相关文章:

PHP 链接错误处理

c# - 在这种情况下主线程会发生什么

.net - 从 vb.net 中的文件中提取值

asp.net - .NET 4.5 中 Textmode Time 属性上的文本在代码隐藏中消失

mysql - Insert语句向数据库添加数据

java - 我怎样才能捕捉到 NoSuchMethodException?

.NET 4 加载不同于 .NET 3.5 的程序集

.net - 如何在 WPF 中的控件顶部显示进度条

c# - .NET Framework 是否提供解析 HTML 字符串的方法?

c# - 大量 bool 值的任何拳击问题?有什么选择吗?