【发布时间】: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