Aplikacioni yt vazhdon të punojë ndërsa tuneli vdes. Wi-Fi është ende aktiv, interneti ende përgjigjet, dhe API-ja private nga e cila varet aplikacioni është bërë e paarritshme. Ngjarja .NET të cilës njerëzit zakonisht i drejtohen këtu, NetworkAvailabilityChanged, nuk e përshkruan fare atë situatë. Ajo raporton një ndryshim në gjendjen e përgjithshme të makinës, dhe kjo gjendje mund të mbetet e vërtetë gjatë shkëputjes dhe rilidhjes së VPN. Një vëzhgues duhet të ndjekë klientin që zotëron tunelin, jo përmbledhjen e stivës së rrjetit.

Disponueshmëria është një agregat, jo tuneli yt

NetworkAvailabilityChanged aktivizohet kur ndryshon përgjigja e përgjithshme e disponueshmërisë së makinës, dhe ajo përgjigje numëron çdo ndërfaqe aktive përveç loopback ose një tuneli.

Një rënie e VPN ndërsa Wi-Fi është aktiv nuk ndryshon asgjë nga ajo që mat, prandaj ngjarja mund të mbetet e heshtur pikërisht gjatë dështimit që të intereson.

Rrjedha e gjendjes i përket klientit që zotëron tunelin

Identifiko cili komponent zotëron lidhjen: GUI ose shërbimi i OpenVPN, OpenVPN Connect, ose një proces që aplikacioni yt ka nisur dhe kontrollon. Këta janë pronarë të ndryshëm me ndërfaqe të mbështetura të ndryshme, dhe vëzhguesi duhet të përdorë atë që përputhet me vendosjen. Për një proces OpenVPN me të cilin je i autorizuar të integrohesh, ndërfaqja e menaxhimit raporton gjendjen aktuale, historikun dhe njoftimet në kohë reale. Analizo mesazhet e strukturuara të dokumentuara në vend që të kërkosh fjalën connected në një titull GUI të lokalizuar.

Kanali i menaxhimit është një sipërfaqe kontrolli e privilegjuar, prandaj mos hap një dëgjues të ri dhe mos u grind me GUI-në për një kanal që ajo tashmë e mban.

Gardianët e gjeneratës ndalojnë rezultatet e vjetruara

Çdo vëzhgim i përket një përpjekjeje të caktuar lidhjeje. Rrit një numërues gjenerate kur nis një përpjekje e re, kur humbet kanali dhe kur klienti raporton daljen.

Merr në shqyrtim një kontroll të nisur gjatë lidhjes A. Tuneli bie, lidhja B fillon, dhe më pas arrin suksesi HTTP i vonuar i A. Pa një gardian, ai rezultat i vjetër e bën ekranin jeshil ndërsa B ende po vërtetohet. Anulimi zvogëlon punën e humbur, dhe kontrolli i gjeneratës është ai që pengon një përfundim të vjetruar të bëhet gjendja aktuale:

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

Zbato të njëjtin rregull rreth dërgimit në UI, sepse përditësimi i marshaluar mund të arrijë pasi gjenerata ka shkuar përpara.

Inicializimi dhe rilidhja janë një cikël i vetëm jetësor

Trajto lidhjen e parë, rilidhjen dhe humbjen e kanalit si një cikël të vetëm jetësor me një grup të vetëm rregullash:

  • Lexo gjendjen aktuale dhe abonohu në njoftime në një hap ku ndërfaqja e lejon.
  • Etiketo çdo vëzhgim me identitetin e lidhjes dhe gjeneratën.
  • Anulo gatishmërinë në rilidhje, dalje ose në një kanal vëzhgimi të humbur.
  • Kontrollo burimin privat vetëm pasi pronari raporton përfundimin e inicializimit.
  • Publiko vetëm rezultatet që ende i përkasin gjeneratës aktuale.

Një kanal i humbur do të thotë i panjohur, nuk do të thotë i shkëputur. Raportimi i të panjohurës është më i ndershëm sesa raportimi i një shkëputjeje që nuk mund ta provosh, dhe e pengon logjikën e ripërpjekjes të veprojë mbi një hamendje.

Raporto prova, jo një vlerë boolean

Kthe gjendjen e emërtuar të sesionit dhe gatishmërinë e burimit si vlera të veçanta, secila me një moshë. Një konsumator që duhet të vendosë diçka mund të shohë atëherë se kontrolli i fundit i suksesshëm është dyzet sekonda i vjetër, që është informacion i ndryshëm nga një i freskët.

Një kërkim i IP-së publike nuk është provë që një API private përdori rrugën e kërkuar, prandaj mos e paraqit si të tillë.

Mbaj zbatimin jashtë vëzhguesit

Një callback ekzekutohet pas faktit. Nuk mund të garantojë që asnjë paketë nuk e la makinën midis ngjarjes dhe trajtuesit. Nëse dizajni kërkon bllokim, politika e rrjetit duhet ta ofrojë, dhe detyra e vëzhguesit është t'u shpjegojë provat thirrësit të tij. Përzierja e të dyjave prodhon kod që mendon se është firewall sepse mban një boolean. Mbaj shtresën e zbatimit të mërzitshme dhe të testueshme, dhe lëre vëzhguesin të mbetet lexues.

Atëherë pyetja e UI bëhet e thjeshtë: trego çfarë dihet, bashkë me moshën e tij, dhe thuaj i panjohur kur është kështu.

Artikuj të ngjashëm