Sovelluksesi jatkaa toimintaa, kun tunneli kuolee. Wi-Fi on yhä päällä, internet vastaa yhä, ja yksityinen API, josta sovellus riippuu, on tullut tavoittamattomaksi. .NET-tapahtuma, johon ihmiset yleensä täällä tarttuvat, NetworkAvailabilityChanged, ei kuvaa sitä tilannetta lainkaan. Se raportoi muutoksen koneen kokonaistilassa, ja se tila voi pysyä totena VPN-yhteyden katkeamisen ja uudelleenyhdistämisen ajan. Tarkkailijan on seurattava asiakasta, joka omistaa tunnelin, ei verkkopinon yhteenvetoa siitä.

Käytettävyys on kooste, ei sinun tunnelisi

NetworkAvailabilityChanged laukeaa, kun koneen koostettu käytettävyysvastaus muuttuu, ja se vastaus laskee mukaan jokaisen aktiivisen liitännän paitsi loopbackin tai tunnelin.

VPN:n putoaminen Wi-Fin ollessa päällä ei muuta mitään siitä, mitä se mittaa, siksi tapahtuma voi pysyä vaiti juuri sen vian aikana, josta välität.

Tilavirta kuuluu asiakkaalle, joka omistaa tunnelin

Selvitä, mikä komponentti omistaa yhteyden: OpenVPN:n GUI tai palvelu, OpenVPN Connect tai prosessi, jonka sovelluksesi käynnisti ja jota se hallitsee. Ne ovat eri omistajia eri tuetuilla rajapinnoilla, ja tarkkailijan on käytettävä käyttöönottoon sopivaa. OpenVPN-prosessille, jonka kanssa sinulla on lupa integroitua, hallintarajapinta raportoi nykyisen tilan, historian ja reaaliaikaiset ilmoitukset. Analysoi dokumentoidut jäsennellyt viestit sen sijaan, että etsisit connected-sanaa lokalisoidusta GUI-otsikosta.

Hallintakanava on etuoikeutettu ohjauspinta, joten älä avaa uutta kuuntelijaa äläkä kiistele GUI:n kanssa kanavasta, joka sillä jo on.

Sukupolvivahdit pysäyttävät vanhentuneet tulokset

Jokainen havainto kuuluu tiettyyn yhteysyritykseen. Kasvata sukupolvilaskuria, kun uusi yritys alkaa, kun kanava menetetään ja kun asiakas ilmoittaa poistumisesta.

Tarkastellaan mittausta, joka alkoi yhteyden A aikana. Tunneli putoaa, yhteys B alkaa, ja sitten A:n viivästynyt HTTP-menestys saapuu. Ilman vahdia tuo vanha tulos tekee näytöstä vihreän, kun B vielä todentaa. Peruutus vähentää hukattua työtä, ja sukupolvitarkistus estää vanhentunutta valmistumista tulemasta nykytilaksi:

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

Sovella samaa sääntöä UI-lähetyksen ympärillä, koska marshalloitu päivitys voi saapua sen jälkeen, kun sukupolvi on edennyt.

Alustus ja uudelleenyhdistäminen ovat yksi elinkaari

Käsittele ensimmäinen yhteys, uudelleenyhdistäminen ja kanavan menetys yhtenä elinkaarena yhdellä sääntöjoukolla:

  • Lue nykyinen tila ja tilaa ilmoitukset yhdessä vaiheessa, missä rajapinta sen sallii.
  • Merkitse jokainen havainto yhteyden identiteetillä ja sukupolvella.
  • Mitätöi valmius uudelleenyhdistämisessä, poistumisessa tai menetetyssä havaintokanavassa.
  • Tutki yksityinen resurssi vasta, kun omistaja ilmoittaa alustuksen valmistuneen.
  • Julkaise vain tulokset, jotka kuuluvat yhä nykyiseen sukupolveen.

Menetetty kanava tarkoittaa tuntematonta, ei irrotettua. Tuntemattoman raportoiminen on rehellisempää kuin sellaisen irrotuksen raportoiminen, jota et voi todistaa, ja se estää uudelleenyrityslogiikkaa toimimasta arvauksen varassa.

Raportoi todisteita, älä totuusarvoa

Palauta nimetty istunnon tila ja resurssin valmius erillisinä arvoina, kummallakin ikä. Kuluttaja, jonka on päätettävä jotain, näkee silloin, että viimeisin onnistunut mittaus on neljänkymmenen sekunnin ikäinen, mikä on eri tieto kuin tuore.

Julkisen IP:n haku ei ole todiste siitä, että yksityinen API käytti vaadittua reittiä, joten älä esitä sitä sellaisena.

Pidä valvonta tarkkailijan ulkopuolella

Takaisinkutsu ajetaan jälkikäteen. Se ei voi taata, ettei yksikään paketti lähtenyt koneesta tapahtuman ja käsittelijän välillä. Jos suunnittelu vaatii estämistä, verkkopolitiikan on tarjottava se, ja tarkkailijan tehtävä on selittää todisteet kutsujalleen. Molempien sekoittaminen tuottaa koodia, joka luulee olevansa palomuuri, koska sillä on totuusarvo. Pidä valvontakerros tylsänä ja testattavana, ja anna tarkkailijan pysyä lukijana.

Silloin UI-kysymys muuttuu yksinkertaiseksi: näytä, mikä tiedetään, sen ikineen, ja sano tuntematon, kun niin on.

Aiheeseen liittyvät artikkelit