Az alkalmazása tovább működik, miközben az alagút haldoklik. A Wi-Fi még él, az internet még válaszol, és a privát API, amelytől az alkalmazás függ, elérhetetlenné vált. A .NET-esemény, amelyhez az emberek itt általában nyúlnak, NetworkAvailabilityChanged, egyáltalán nem írja le ezt a helyzetet. A gép összesített állapotának változását jelzi, és ez az állapot igaz maradhat egy VPN-szakadás és újracsatlakozás során is. A megfigyelőnek azt a klienst kell figyelnie, amely az alagút birtokosa, nem a hálózati verem összefoglalóját.

Az elérhetőség összesített érték, nem az alagútja

NetworkAvailabilityChanged akkor lép fel, amikor a gép összesített elérhetőségi válasza megváltozik, és ez a válasz minden aktív interfészt számít, kivéve a loopbacket vagy egy alagutat.

Egy VPN-kiesés Wi-Fi mellett semmin sem változtat abból, amit mér, ezért az esemény éppen az Önt érdeklő hiba alatt maradhat csendben.

Az állapotfolyam a birtokos klienshez tartozik

Azonosítsa, melyik komponens birtokolja a kapcsolatot: az OpenVPN GUI vagy szolgáltatás, az OpenVPN Connect, vagy egy folyamat, amelyet az alkalmazása indított és vezérel. Ezek különböző birtokosok különböző támogatott interfészekkel, és a megfigyelőnek a telepítéshez illőt kell használnia. Egy OpenVPN-folyamatnál, amellyel jogosult integrálódni, a felügyeleti interfész jelenti a jelenlegi állapotot, az előzményeket és a valós idejű értesítéseket. A dokumentált strukturált üzeneteket elemezze, ne egy lokalizált GUI-feliratban keresse a connected szót.

A felügyeleti csatorna kiváltságos vezérlőfelület, ezért ne nyisson új figyelőt, és ne vitatkozzon a GUI-val egy olyan csatornáért, amely már az övé.

A generációvédők megállítják az elavult eredményeket

Minden megfigyelés egy adott kapcsolódási kísérlethez tartozik. Növelje a generációszámlálót, amikor új kísérlet indul, amikor a csatorna elveszik, és amikor a kliens kilépést jelent.

Vegyünk egy ellenőrzést, amely az A kapcsolat alatt indult. Az alagút leesik, a B kapcsolat elindul, majd megérkezik az A késleltetett HTTP-sikere. Védő nélkül az a régi eredmény zöldre váltja a kijelzőt, miközben a B még hitelesít. A megszakítás csökkenti a pazarlott munkát, és a generációellenőrzés az, ami megakadályozza, hogy egy elavult befejezés aktuális állapottá váljon:

var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);

Ugyanezt a szabályt alkalmazza az UI-küldés körül, mert a marshalolt frissítés megérkezhet, miután a generáció tovább lépett.

Az inicializálás és az újracsatlakozás egyetlen életciklus

Kezelje az első kapcsolódást, az újracsatlakozást és a csatornavesztést egyetlen életciklusként, egyetlen szabálykészlettel:

  • Olvassa be az aktuális állapotot, és iratkozzon fel az értesítésekre egy lépésben, ahol az interfész engedi.
  • Címkézze meg minden megfigyelést a kapcsolat identitásával és a generációval.
  • Érvénytelenítse a készenlétet újracsatlakozáskor, kilépéskor vagy elveszett megfigyelési csatornán.
  • Csak akkor ellenőrizze a privát erőforrást, amikor a birtokos jelenti az inicializálás befejezését.
  • Csak olyan eredményeket tegyen közzé, amelyek még az aktuális generációhoz tartoznak.

Az elveszett csatorna ismeretlent jelent, nem szétkapcsoltat. Az ismeretlen jelentése őszintébb, mint egy bizonyíthatatlan szétkapcsolás jelentése, és megakadályozza, hogy az újrapróbálkozási logika találgatásra cselekedjen.

Bizonyítékot jelentsen, ne logikai értéket

Adja vissza a megnevezett munkamenet-állapotot és az erőforrás-készenlétet külön értékként, mindegyiket korral. Az a fogyasztó, akinek döntenie kell valamiről, láthatja, hogy az utolsó sikeres ellenőrzés negyven másodperces, ami más információ, mint egy friss.

Egy nyilvános IP-keresés nem bizonyítja, hogy egy privát API a szükséges útvonalat használta, ezért ne úgy mutassa be, mintha az lenne.

Tartsa a kényszerítést a megfigyelőn kívül

Egy visszahívás utólag fut. Nem tudja garantálni, hogy az esemény és a kezelő között nem hagyta el csomag a gépet. Ha a tervezés blokkolást igényel, a hálózati házirendnek kell biztosítania, és a megfigyelő feladata, hogy elmagyarázza a bizonyítékokat a hívójának. A kettő keverése olyan kódot eredményez, amely logikai érték tartása miatt tűzfalnak hiszi magát. Tartsa a kényszerítési réteget unalmasnak és tesztelhetőnek, és hagyja, hogy a megfigyelő olvasó maradjon.

Akkor az UI kérdése egyszerűvé válik: mutassa meg, ami ismert, a korával együtt, és mondja ki ismeretlennek, amikor az.

Kapcsolódó cikkek