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