C# OpenVPN-i olekuvaatleja: jälgi sessiooni, mitte võrgukaarti
NetworkAvailabilityChanged ei ole VPN-sündmus. Loe tunnelit omava kliendi olekuvoogu, kaitse vananenud sondide eest ja avalda valmidus ühenduse kaupa.
Sinu rakendus jätkab tööd, samal ajal kui tunnel sureb. Wi-Fi on endiselt üleval, internet vastab endiselt ja privaatne API, millest rakendus sõltub, on muutunud kättesaamatuks. .NET-i sündmus, mille poole inimesed siin tavaliselt pöörduvad, NetworkAvailabilityChanged, ei kirjelda seda olukorda üldse. See teatab masina koondoleku muutusest ja see olek võib jääda tõeseks üle VPN-i katkemise ja taasühenduse. Vaatleja peab jälgima klienti, kellele tunnel kuulub, mitte võrgupinu kokkuvõtet sellest.
Kättesaadavus on koondnäitaja, mitte sinu tunnel
NetworkAvailabilityChanged käivitub, kui masina koondkättesaadavuse vastus muutub, ja see vastus arvestab iga aktiivset liidest peale loopbacki või tunneli.
VPN-i langus Wi-Fi töötamise ajal ei muuda midagi, mida see mõõdab, seepärast võib sündmus vaikida täpselt selle rikke ajal, mis sind huvitab.
Olekuvoog kuulub kliendile, kellele tunnel kuulub
Tehke kindlaks, milline komponent ühendust omab: OpenVPN GUI või teenus, OpenVPN Connect või protsess, mille sinu rakendus käivitas ja mida juhib. Need on erinevad omanikud erinevate toetatud liidestega ja vaatleja peab kasutama seda, mis vastab juurutusele. OpenVPN-i protsessi puhul, millega sul on luba integreeruda, teatab haldusliides praegusest olekust, ajaloost ja reaalajas teavitustest. Analüüsi dokumenteeritud struktureeritud sõnumeid, mitte ära otsi lokaliseeritud GUI pealkirjast sõna connected.
Halduskanal on privilegeeritud juhtimispind, seega ärge avage uut kuulajat ega vaidlege GUI-ga kanali pärast, mida see juba hoiab.
Põlvkonna valvurid peatavad vananenud tulemused
Iga vaatlus kuulub konkreetse ühenduskatse juurde. Suurendage põlvkonna loendurit, kui algab uus katse, kui kanal kaob ja kui klient teatab väljumisest.
Mõelge sondile, mis algas ühenduse A ajal. Tunnel kukub, algab ühendus B ja seejärel saabub A hilinenud HTTP-edu. Ilma valvurita muudab see vana tulemus ekraani roheliseks, samal ajal kui B alles autendib. Tühistamine vähendab raisatud tööd ja põlvkonna kontroll on see, mis takistab vananenud lõpetamisel saada praeguseks olekuks:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
Rakendage sama reeglit UI-saatmise ümber, sest marshaldatud uuendus võib saabuda pärast seda, kui põlvkond on edasi liikunud.
Initsialiseerimine ja taasühendus on üks elutsükkel
Käsitlege esimest ühendust, taasühendust ja kanali kadu ühe elutsükli ja ühe reeglistikuna:
- Lugege praegust olekut ja tellige teavitusi ühes sammus, kus liides seda lubab.
- Märgistage iga vaatlus ühenduse identiteedi ja põlvkonnaga.
- Muutke valmidus kehtetuks taasühendusel, väljumisel või kaotatud vaatluskanalil.
- Sondige privaatset ressurssi alles pärast seda, kui omanik teatab initsialiseerimise lõpetamisest.
- Avaldage ainult tulemusi, mis kuuluvad veel praegusesse põlvkonda.
Kaotatud kanal tähendab teadmata, mitte katkestatud. Teadmata teatamine on ausam kui katkestuse teatamine, mida te tõestada ei saa, ja see takistab korduskatse loogikal oletuse põhjal tegutseda.
Teatage tõendeid, mitte tõeväärtust
Tagastage nimetatud sessiooni olek ja ressursi valmidus eraldi väärtustena, kummalgi vanus. Tarbija, kes peab midagi otsustama, näeb siis, et viimane edukas sond on nelikümmend sekundit vana, mis on teine teave kui värske.
Avaliku IP otsing ei ole tõend, et privaatne API kasutas nõutud marsruuti, seega ärge esitage seda nii, nagu oleks.
Hoidke jõustamine vaatlejast väljas
Tagasikutse töötab pärast sündmust. See ei saa garanteerida, et sündmuse ja töötleja vahel ei lahkunud masinast ükski pakett. Kui disain nõuab blokeerimist, peab võrgupoliitika selle pakkuma, ja vaatleja ülesanne on tõendeid oma kutsujale selgitada. Kahe segamine loob koodi, mis usub end olevat tulemüür, sest hoiab tõeväärtust. Hoidke jõustamiskiht igav ja testitav ning laske vaatlejal jääda lugejaks.
Siis muutub UI küsimus lihtsaks: näidake, mis on teada, koos selle vanusega, ja öelge teadmata, kui nii on.