Vaša aplikacija nastavlja raditi dok tunel umire. Wi-Fi je još aktivan, internet još odgovara, a privatni API o kojem aplikacija zavisi postao je nedostupan. .NET događaj kojem ljudi ovdje obično posežu, NetworkAvailabilityChanged, uopće ne opisuje tu situaciju. On prijavljuje promjenu u zbirnom stanju mašine, a to stanje može ostati tačno i kroz prekid i ponovno uspostavljanje VPN veze. Posmatrač mora gledati klijenta koji posjeduje tunel, a ne sažetak mrežnog steka o njemu.

Dostupnost je zbirna vrijednost, ne vaš tunel

NetworkAvailabilityChanged se aktivira kada se zbirni odgovor mašine o dostupnosti promijeni, a taj odgovor računa svaki aktivni interfejs osim loopbacka ili tunela.

Pad VPN-a dok je Wi-Fi aktivan ne mijenja ništa što ona mjeri, zato događaj može ostati tih tokom upravo onog kvara koji vas zanima.

Tok stanja pripada klijentu koji posjeduje tunel

Utvrdite koja komponenta posjeduje vezu: OpenVPN GUI ili servis, OpenVPN Connect, ili proces koji je vaša aplikacija pokrenula i kontroliše. To su različiti vlasnici s različitim podržanim interfejsima, a posmatrač mora koristiti onaj koji odgovara postavljanju. Za OpenVPN proces s kojim imate ovlaštenje da se integrišete, upravljački interfejs prijavljuje trenutno stanje, historiju i obavještenja u realnom vremenu. Analizirajte dokumentovane strukturirane poruke umjesto da u lokalizovanom GUI natpisu tražite riječ connected.

Upravljački kanal je privilegovana kontrolna površina, zato ne otvarajte novi slušalac i ne svađajte se s GUI-jem oko kanala koji već drži.

Generacijske zaštite zaustavljaju zastarjele rezultate

Svako posmatranje pripada određenom pokušaju povezivanja. Povećajte brojač generacije kada počne novi pokušaj, kada se izgubi kanal i kada klijent prijavi izlaz.

Uzmite provjeru započetu tokom veze A. Tunel padne, počne veza B, a zatim stigne A-ov odgođeni HTTP uspjeh. Bez zaštite, taj stari rezultat čini prikaz zelenim dok se B još autentifikuje. Otkazivanje smanjuje uzaludan rad, a generacijska provjera je ono što sprječava da zastarjeli završetak postane trenutno stanje:

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

Primijenite isto pravilo oko UI dispečinga, jer marshalirano ažuriranje može stići nakon što je generacija otišla dalje.

Inicijalizacija i ponovno povezivanje su jedan životni ciklus

Tretirajte prvo povezivanje, ponovno povezivanje i gubitak kanala kao jedan životni ciklus s jednim skupom pravila:

  • Pročitajte trenutno stanje i pretplatite se na obavještenja u jednom koraku gdje interfejs to dozvoljava.
  • Označite svako posmatranje identitetom veze i generacijom.
  • Poništite spremnost pri ponovnom povezivanju, izlazu ili izgubljenom kanalu posmatranja.
  • Provjerite privatni resurs tek nakon što vlasnik prijavi da je inicijalizacija završena.
  • Objavljujte samo rezultate koji još pripadaju trenutnoj generaciji.

Izgubljen kanal znači nepoznato, a ne prekinuto. Prijavljivanje nepoznatog je iskrenije od prijavljivanja prekida koji ne možete dokazati, i sprječava logiku ponovnih pokušaja da djeluje na pretpostavku.

Prijavite dokaze, ne boolean

Vratite naznačeno stanje sesije i spremnost resursa kao odvojene vrijednosti, svaku s dobi. Potrošač koji mora nešto odlučiti tada vidi da posljednja uspješna provjera ima četrdeset sekundi, što je drugačija informacija od svježe.

Traženje javne IP adrese nije dokaz da je privatni API koristio potrebnu rutu, zato to ne predstavljajte kao da jeste.

Držite provođenje izvan posmatrača

Povratni poziv se izvršava nakon činjenice. Ne može garantovati da između događaja i rukovaoca nije izašao nijedan paket s mašine. Ako dizajn zahtijeva blokiranje, mrežna politika to mora osigurati, a zadatak posmatrača je objasniti dokaze svom pozivaocu. Miješanje dvoje stvara kod koji misli da je firewall jer drži boolean. Držite sloj provođenja dosadnim i testabilnim, a posmatrač neka ostane čitalac.

Tada UI pitanje postaje jednostavno: pokažite što je poznato, s njegovom dobi, i recite nepoznato kada to jeste.

Povezani članci