我希望我的应用程序在连接可用时连接到服务器(以检查更新),但当连接不可用时什么也不做。我担心每当我的程序尝试这样做时,具有拨号连接的人可能会收到其中一个提示来拨打他们的 ISP。我意识到现在很少有人使用拨号上网,但仍然如此。
我自己已经关闭拨号十多年了,所以老实说,我不知道WebRequest
在离线时执行 HTTP 请求(例如使用 a )是否会显示这样的“拨号”提示。会吗?如果是这样,我怎样才能检查更新而不引起这样的提示?
通过使用这个:
My.Computer.Network.IsAvailable
也许是这样的:
Dim available As Boolean
Try
Dim client As New System.Net.Sockets.TcpClient("google.com", 80)
available = True
Catch ex As Exception
available = False
End Try
如果结果为“可用”,您可以检查更新是否可用。
WinInet Api实现的功能:
BOOL InternetGetConnectedState(
_Out_ LPDWORD lpdwFlags,
_In_ DWORD dwReserved
);
编辑:
我提供了一个可用于测试的小代码示例。
值得注意的是,在底层,My.Computer.Network.IsAvailable
P/Invokes并在丢弃标志的同时InternetGetConnectedState
简单地返回一个真/假值。WinNt 和更高版本它通过网络接口枚举并为第一个连接的接口返回 true。
using System;
namespace InternetGetConnectedState
{
[Flags]
enum InternetConnectionFlags : uint
{
// Flags for InternetGetConnectedState and Ex
Modem = 0x01,
Lan = 0x02,
Proxy = 0x04,
ModemBusy = 0x08, /* no longer used */
RasInstalled = 0x10,
Offline = 0x20,
Configured = 0x40
}
class Program
{
[System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
static extern bool InternetGetConnectedState(out InternetConnectionFlags flags, uint dwReserved);
static void Main(string[] args)
{
InternetConnectionFlags flags;
bool connectedState = InternetGetConnectedState(out flags, 0)
// TODO: Check Flags
}
}
}
编辑 2:
在进一步查看 ILSpy 转储后,在 NT 之前在 Windows上进行My.Computer.Network.IsAvailable
P/ Invokes。InternetGetConnectedState
在 WinNt 及更高版本上,它通过网络接口枚举并为第一个连接的接口返回 true。所以,要么
My.Computer.Network.IsAvailable 'vb.net
或者
System.Net.NetworkInformation.GetIsNetworkAvailable(); // C#
是可行的解决方案。
也许禁用自动更新的选项是避免最终用户烦恼的另一种可能的解决方案。