適用場景
- Silverlight / WPF / WinForms / Console 應用,需輕量級檢測「是否聯網」,不想引入完整 HTTP 請求開銷。
- 離線模式切換、同步觸發條件判斷。
P/Invoke 簽名
using System;
using System.Runtime.InteropServices;
public static class NetworkDetector
{
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetGetConnectedState(out int lpdwFlags, int dwReserved);
public static bool IsConnected()
{
int flags = 0;
return InternetGetConnectedState(out flags, 0);
}
// 進階:解析連線類型旗標
public static ConnectionType GetConnectionType()
{
int flags = 0;
if (!InternetGetConnectedState(out flags, 0)) return ConnectionType.Offline;
// flags 位元定義參考 MSDN INTERNET_CONNECTION_*
return (ConnectionType)flags;
}
}
[Flags]
public enum ConnectionType
{
Offline = 0,
Modem = 0x01, // INTERNET_CONNECTION_MODEM
LAN = 0x02, // INTERNET_CONNECTION_LAN
Proxy = 0x04, // INTERNET_CONNECTION_PROXY
ModemBusy = 0x08, // INTERNET_CONNECTION_MODEM_BUSY
// ... 其餘旗標略
}
呼叫示例
if (NetworkDetector.IsConnected())
{
Console.WriteLine("Online - 可發起網路請求");
}
else
{
Console.WriteLine("Offline - 切換離線模式/提示用戶");
}
注意事項
- 僅反映 Windows 網路介面層面的「連線狀態」,不保證能訪問特定網站/伺服器(防火牆、代理、DNS 故障、認證頁攔截均可能導致誤判)。
- 生產環境建議雙重檢測:
InternetGetConnectedState 快速篩選 + 實際 HTTP HEAD/GET 請求目標端點驗證。
- Silverlight 5 已停止支援(2021/10 結束生命週期),新專案請遷移至 Blazor / MAUI / ASP.NET Core + WebAssembly。
替代方案對比
| 方案 | 優點 | 缺點 |
| InternetGetConnectedState | 零依賴、極快、無網路流量 | 無法檢測應用層連通性、代理/認證頁誤判 |
| HttpClient/GetAsync HEAD | 真實驗證目標可達性 | 有延遲、消耗流量、需處理例外 |
| NetworkInformation.GetInternetConnectionProfile (UWP/WinRT) | 現代 API、支援網路成本/漫遊/資料限制感知 | 僅限 Win10+ / UWP / WinUI 3 |
| Ping (ICMP) | 簡單、跨平台 | ICMP 常被封鎖、不代表 TCP/HTTP 通 |