Kiểm tra xem máy có kết nối internet hoạt động hay không bằng cách gửi request đến endpoint tin cậy.
Cách 1: HttpClient / WebClient ping endpoint tin cậy
using System.Net.Http;
public static async Task IsConnectedAsync()
{
try
{
using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(5) };
// Google 204 endpoint: trả về 204 No Content, rất nhẹ
var response = await client.GetAsync("https://www.google.com/generate_204");
return response.IsSuccessStatusCode;
}
catch
{
return false;
}
}
// Synchronous (legacy)
public static bool IsConnected()
{
try
{
using var client = new WebClient { Timeout = 5000 };
using var stream = client.OpenRead("https://www.google.com/generate_204");
return true;
}
catch
{
return false;
}
}
Cách 2: NetworkInformation (Chỉ check network interface, không đảm bảo internet)
using System.Net.NetworkInformation;
public static bool IsNetworkAvailable()
{
return NetworkInterface.GetIsNetworkAvailable();
// Chỉ báo có network adapter up, KHÔNG đảm bảo có internet
}
Cách 3: Ping (ICMP) - Nhanh nhưng có thể bị chặn firewall
using System.Net.NetworkInformation;
public static bool PingCheck(string host = "8.8.8.8", int timeoutMs = 3000)
{
try
{
using var ping = new Ping();
PingReply reply = ping.Send(host, timeoutMs);
return reply.Status == IPStatus.Success;
}
catch
{
return false;
}
}
Ví dụ hoàn chỉnh: Retry loop
class Program
{
static async Task Main()
{
Console.WriteLine("Checking internet connection...");
while (true)
{
bool connected = await IsConnectedAsync();
Console.WriteLine(connected ? "✓ Connected" : "✗ Disconnected");
if (connected) break;
await Task.Delay(5000); // Wait 5s before retry
}
}
static async Task IsConnectedAsync()
{
try
{
using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(3) };
var resp = await client.GetAsync("https://www.google.com/generate_204");
return resp.IsSuccessStatusCode;
}
catch { return false; }
}
}
Endpoint tin cậy cho health check
| URL | Provider | Đặc điểm |
|---|---|---|
| https://www.google.com/generate_204 | 204 No Content, rất nhẹ, chuẩn cho Android/Chrome | |
| https://connectivitycheck.gstatic.com/generate_204 | Tương tự, dùng cho captive portal detection | |
| https://www.msftconnecttest.com/connecttest.txt | Microsoft | Trả về "Microsoft Connect Test" |
| https://cloudflare.com/cdn-cgi/trace | Cloudflare | Trả về thông tin trace, hỗ trợ HTTPS |
Best Practices
- Dùng HttpClient (không dùng WebClient - obsolete).
- Set Timeout ngắn (3-5s) để không block lâu.
- Dùng endpoint HTTP (không HTTPS) để tránh SSL handshake overhead + cert issues.
- Catch tất cả exception (network, DNS, timeout, SSL).
- Không check liên tục trong loop chặt -> dùng timer/background service.
- Trong ASP.NET Core: Health Checks (
Microsoft.Extensions.Diagnostics.HealthChecks).