C# OpenVPN durum gözlemcisi: oturumu izleyin, ağ kartını değil
NetworkAvailabilityChanged bir VPN olayı değildir. Tüneli sahiplenen istemcinin durum akışını okuyun, eski yoklamalara karşı korunun ve her bağlantı için hazır olma durumunu yayımlayın.
Tünel ölürken uygulamanız çalışmaya devam eder. Wi-Fi hâlâ açık, internet hâlâ yanıt veriyor ve uygulamanın bağlı olduğu özel API erişilemez hale geldi. İnsanların burada genellikle başvurduğu .NET olayı, NetworkAvailabilityChanged, bu durumu hiç anlatmaz. Makinenin toplu durumundaki bir değişikliği bildirir ve bu durum bir VPN kopması ve yeniden bağlanması boyunca doğru kalabilir. Bir gözlemci, tüneli sahiplenen istemciyi izlemelidir, ağ yığınının onunla ilgili özetini değil.
Kullanılabilirlik bir toplam değerdir, sizin tüneliniz değil
NetworkAvailabilityChanged makinenin toplu kullanılabilirlik yanıtı değiştiğinde tetiklenir ve bu yanıt loopback veya tünel dışındaki her etkin arayüzü sayar.
Wi-Fi açıkken VPN'in düşmesi ölçtüğü hiçbir şeyi değiştirmez, bu yüzden olay tam da sizi ilgilendiren arıza sırasında sessiz kalabilir.
Durum akışı tüneli sahiplenen istemciye aittir
Bağlantıyı hangi bileşenin sahiplendiğini belirleyin: OpenVPN GUI veya hizmeti, OpenVPN Connect ya da uygulamanızın başlatıp denetlediği bir süreç. Bunlar farklı desteklenen arayüzlere sahip farklı sahiplerdir ve gözlemci dağıtıma uyanı kullanmalıdır. Entegre olma yetkiniz olan bir OpenVPN süreci için yönetim arayüzü geçerli durumu, geçmişi ve gerçek zamanlı bildirimleri raporlar. Yerelleştirilmiş bir GUI başlığında connected kelimesini aramak yerine belgelenmiş yapılandırılmış mesajları çözümleyin.
Yönetim kanalı ayrıcalıklı bir denetim yüzeyidir, bu yüzden yeni bir dinleyici açmayın ve GUI'nin zaten sahip olduğu bir kanal için onunla çekişmeyin.
Nesil koruyucuları eski sonuçları durdurur
Her gözlem belirli bir bağlantı denemesine aittir. Yeni bir deneme başladığında, kanal kaybolduğunda ve istemci çıkış bildirdiğinde nesil sayacını artırın.
A bağlantısı sırasında başlatılan bir yoklamayı düşünün. Tünel düşer, B bağlantısı başlar ve ardından A'nın gecikmiş HTTP başarısı gelir. Koruyucu olmadan bu eski sonuç, B hâlâ kimlik doğrularken ekranı yeşile çevirir. İptal boşa giden işi azaltır ve nesil denetimi, eski bir tamamlanmanın güncel durum haline gelmesini engelleyen şeydir:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Aynı kuralı UI gönderimi çevresinde de uygulayın, çünkü marshallanan güncelleme nesil ilerledikten sonra gelebilir.
Başlatma ve yeniden bağlanma tek bir yaşam döngüsüdür
İlk bağlantıyı, yeniden bağlanmayı ve kanal kaybını tek bir kural kümesine sahip tek bir yaşam döngüsü olarak ele alın:
- Arayüzün izin verdiği yerde geçerli durumu okuyun ve bildirimlere tek adımda abone olun.
- Her gözlemi bağlantı kimliği ve nesil ile etiketleyin.
- Yeniden bağlanmada, çıkışta veya kaybolan bir gözlem kanalında hazır olma durumunu geçersiz kılın.
- Özel kaynağı yalnızca sahibi başlatmanın tamamlandığını bildirdikten sonra yoklayın.
- Yalnızca hâlâ güncel nesle ait sonuçları yayımlayın.
Kaybolan kanal bilinmiyor demektir, bağlantı kesildi değil. Bilinmiyor bildirmek, kanıtlayamadığınız bir kopmayı bildirmekten daha dürüsttür ve yeniden deneme mantığının bir tahmine göre hareket etmesini engeller.
Kanıt bildirin, boolean değil
Adlandırılmış oturum durumunu ve kaynak hazır olma durumunu ayrı değerler olarak döndürün, her biri bir yaş taşısın. Bir şeye karar vermesi gereken tüketici, son başarılı yoklamanın kırk saniyelik olduğunu görebilir; bu, taze bilgiden farklı bir bilgidir.
Genel IP araması, özel bir API'nin gereken yolu kullandığının kanıtı değildir, bu yüzden öyleymiş gibi sunmayın.
Uygulamayı gözlemcinin dışında tutun
Geri çağırma olaydan sonra çalışır. Olay ile işleyici arasında makineden hiçbir paketin çıkmadığını garanti edemez. Tasarım engelleme gerektiriyorsa bunu ağ politikası sağlamalıdır ve gözlemcinin işi kanıtları çağırana açıklamaktır. İkisini karıştırmak, boolean tuttuğu için kendini güvenlik duvarı sanan kod üretir. Uygulama katmanını sıkıcı ve test edilebilir tutun, gözlemci okuyucu olarak kalsın.
O zaman UI sorusu basitler: bilineni yaşıyla birlikte gösterin ve bilinmiyorsa bilinmiyor deyin.