Pozorovateľ stavu OpenVPN v C#: sledujte reláciu, nie sieťovú kartu
NetworkAvailabilityChanged nie je udalosť VPN. Čítajte tok stavu od klientského vlastníka, chráňte sa pred zastaranými sondami a publikujte pripravenosť pre každé spojenie.
Vaša aplikácia ďalej funguje, kým tunel umiera. Wi-Fi je stále zapnutá, internet stále odpovedá a súkromné API, od ktorého aplikácia závisí, sa stalo nedostupným. Udalosť .NET, ku ktorej sa ľudia v tejto situácii zvyčajne uchyľujú, NetworkAvailabilityChanged, túto situáciu vôbec neopisuje. Hlási zmenu agregovaného stavu stroja a tento stav môže zostať pravdivý aj počas odpojenia a opätovného pripojenia VPN. Pozorovateľ musí sledovať klienta, ktorý tunel vlastní, nie zhrnutie sieťového zásobníka o ňom.
Dostupnosť je agregát, nie váš tunel
NetworkAvailabilityChanged sa spustí, keď sa zmení agregovaná odpoveď stroja o dostupnosti, a táto odpoveď počíta každé aktívne rozhranie okrem loopbacku alebo tunela.
Výpadok VPN pri zapnutej Wi-Fi nemení nič z toho, čo meria, preto môže udalosť mlčať práve počas poruchy, na ktorej vám záleží.
Tok stavu patrí klientovi, ktorý tunel vlastní
Určite, ktorá komponenta spojenie vlastní: GUI alebo služba OpenVPN, OpenVPN Connect, alebo proces, ktorý vaša aplikácia spustila a ovláda. Sú to rôzni vlastníci s rôznymi podporovanými rozhraniami a pozorovateľ musí použiť to, ktoré zodpovedá nasadeniu. Pri procese OpenVPN, s ktorým máte oprávnenie sa integrovať, rozhranie správy hlási aktuálny stav, históriu a oznámenia v reálnom čase. Analyzujte dokumentované štruktúrované správy namiesto hľadania slova connected v lokalizovanom popise GUI.
Kanál správy je privilegovaná riadiaca plocha, takže neotvárajte nový poslucháč a neháďte sa s GUI o kanál, ktorý už drží.
Generačné poistky zastavujú zastarané výsledky
Každé pozorovanie patrí ku konkrétnemu pokusu o pripojenie. Zvýšte počítadlo generácie, keď sa začína nový pokus, keď sa stratí kanál a keď klient ohlási ukončenie.
Zoberte sondu spustenú počas spojenia A. Tunel spadne, začne spojenie B a potom dorazí oneskorený úspech HTTP od A. Bez poistky ten starý výsledok zmení displej na zelený, kým sa B ešte autentizuje. Zrušenie znižuje zbytočnú prácu a generačná kontrola je to, čo bráni tomu, aby sa zastarané dokončenie stalo aktuálnym stavom:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Rovnaké pravidlo použite aj okolo odosielania do UI, pretože zaradená aktualizácia môže doraziť po tom, ako generácia postúpila.
Inicializácia a opätovné pripojenie sú jeden životný cyklus
Považujte prvé pripojenie, opätovné pripojenie a stratu kanála za jeden životný cyklus s jednou sadou pravidiel:
- Prečítajte aktuálny stav a prihláste sa na odber oznámení v jednom kroku, kde to rozhranie umožňuje.
- Označte každé pozorovanie identitou spojenia a generáciou.
- Zneplatnite pripravenosť pri opätovnom pripojení, ukončení alebo stratenej pozorovacej kanáli.
- Sondujte súkromný zdroj až po tom, ako vlastník ohlási dokončenie inicializácie.
- Publikujte len výsledky, ktoré stále patria aktuálnej generácii.
Stratený kanál znamená neznámo, nie odpojené. Hlásiť neznámo je čestnejšie ako hlásiť odpojenie, ktoré nemôžete dokázať, a bráni tomu, aby logika opakovania konala na základe dohadu.
Hláste dôkazy, nie boolean
Vracajte pomenovaný stav relácie a pripravenosť zdroja ako oddelené hodnoty, každú s vekom. Spotrebiteľ, ktorý musí niečo rozhodnúť, potom vidí, že posledná úspešná sonda má štyridsať sekúnd, čo je iná informácia než čerstvá.
Vyhľadanie verejnej IP nie je dôkaz, že súkromné API použilo požadovanú trasu, takže to neprezentujte, ako by to dôkaz bol.
Udržujte vynucovanie mimo pozorovateľa
Spätné volanie beží až po udalosti. Nemôže zaručiť, že medzi udalosťou a obsluhou neopustil stroj žiadny paket. Ak návrh vyžaduje blokovanie, musí ho poskytnúť sieťová politika a úlohou pozorovateľa je vysvetliť dôkazy svojmu volajúcemu. Miešanie oboch vytvára kód, ktorý si myslí, že je firewall, pretože drží boolean. Udržujte vynucovaciu vrstvu nudnou a testovateľnou a nechajte pozorovateľa zostať čitateľom.
Potom je otázka UI jednoduchá: ukážte, čo je známe, s jeho vekom, a povedzte neznámo, keď tomu tak je.