我可能会以错误的方式解决这个问题,因为我没有网络请求的经验,所以请耐心等待。
我正在尝试执行以下代码:
webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
当URI可用时,这可以正常工作。但是,如果它不可用(即,如果相应的服务未运行且未公开相关数据),则会收到以下错误消息:
发生SocketException:无法建立连接,因为目标计算机主动拒绝它。
所以,我尝试按如下方式实现try / catch块:
If Not webClient.IsBusy Then
Try
webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
Catch ex As Sockets.SocketException
MsgBox("Error. Service is not running. No data can be extracted.")
End Try
End If
那不起作用。 VB.Net仍然不显示消息框。所以,我尝试了其他的东西:
If Not webClient.IsBusy Then
Dim req As System.Net.WebRequest
req = System.Net.WebRequest.Create(New Uri("http://localhost:8115/"))
Dim resp As System.Net.WebResponse
Dim ready As Boolean = False
Try
resp = req.GetResponse
resp.Close()
ready = True
Catch ex As Sockets.SocketException
MsgBox("Error. Service is not running. No data can be extracted.")
End Try
If ready Then
webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
ready = False
End If
End If
它也不起作用。我必须错误地解决这个问题。有人能告诉我这样做的正确方法是什么?在运行DownloadStringAsync函数之前,有没有办法首先检查数据是否存在?
谢谢!
编辑:要根据Visual Vincent的回答为讨论添加上下文,这是我的代码的样子。只是一个表格。
Imports System.Net
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim webClient As New System.Net.WebClient
Try
WebClient.DownloadStringAsync(New Uri("http://localhost:8115"))
Catch ex As System.Net.Sockets.SocketException
MessageBox.Show("Error")
Catch ex As System.Net.WebException
MessageBox.Show("Error. Service is not running. No data can be extracted.")
Catch ex As Exception
MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message)
End Try
End Sub
End Class
答案 0 :(得分:2)
WebClient.DownloadStringAsync()
方法不会抛出SocketException
,而是抛出WebException
(可能将其内部异常设置为SocketException
)。
例外
<强>引发WebException 强>
组合BaseAddress和地址形成的URI无效。
-OR -
下载资源时出错。
SocketException
大部分时间仅由原始套接字抛出。然后System.Net
命名空间的成员通常将它们包装在WebException
。
所以要修复你的代码:
Try
webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
Catch ex As System.Net.WebException
MessageBox.Show("Error. Service is not running. No data can be extracted.")
End Try
注意:我改为MessageBox.Show()
,因为MsgBox()
已过时,只有与VB6向后兼容才存在。
但是,最佳做法是添加另一个Catch
语句,以捕获所有其他异常,这样就不会让应用程序处于崩溃状态。
您还应该记录来自WebException
的错误消息,因为可能由于其他原因而不仅仅是端点不可用而抛出错误消息。
Try
webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
Catch ex As System.Net.WebException
MessageBox.Show("Error. Service is not running. No data can be extracted.")
Catch ex As Exception
MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message)
End Try