Patuloy na gumagana ang iyong aplikasyon habang namamatay ang tunel. Bukas pa ang Wi-Fi, sumasagot pa ang internet, at ang pribadong API na pinagkakatiwalaan ng app ay hindi na maabot. Ang .NET na kaganapang karaniwang hinahawakan ng mga tao dito, NetworkAvailabilityChanged, ay hindi naglalarawan sa sitwasyong iyon. Nag-uulat ito ng pagbabago sa pinagsamang kalagayan ng makina, at ang kalagayang iyon ay maaaring manatiling totoo sa paghinto at muling pagkonekta ng VPN. Kailangang bantayan ng observer ang kliyenteng may-ari ng tunel, hindi ang buod ng network stack.

Ang availability ay pinagsama, hindi ang iyong tunel

NetworkAvailabilityChanged ay nag-aapoy kapag nagbago ang pinagsamang sagot ng availability ng makina, at binibilang ng sagot na iyon ang anumang aktibong interface maliban sa loopback o tunel.

Ang pagbagsak ng VPN habang bukas ang Wi-Fi ay walang binabago sa sinusukat nito, kaya maaaring manatiling tahimik ang kaganapan sa eksaktong pagkabigo na mahalaga sa iyo.

Ang stream ng estado ay pag-aari ng kliyenteng may-ari ng tunel

Tukuyin kung aling bahagi ang may-ari ng koneksyon: ang OpenVPN GUI o serbisyo, OpenVPN Connect, o isang prosesong sinimulan at kinokontrol ng iyong aplikasyon. Iba't ibang may-ari ito na may iba't ibang sinusuportahang interface, at dapat gamitin ng observer ang tumutugma sa deployment. Para sa prosesong OpenVPN na awtorisado kang isama, iniuulat ng management interface ang kasalukuyang estado, kasaysayan at mga abiso sa real time. Suriin ang mga dokumentadong structured message sa halip na hanapin ang salitang connected sa isang lokal na caption ng GUI.

Ang channel ng pamamahala ay isang pribilehiyadong ibabaw ng kontrol, kaya huwag magbukas ng bagong listener at huwag makipag-away sa GUI para sa channel na hawak na nito.

Pinipigilan ng mga generation guard ang lumang resulta

Bawat obserbasyon ay pag-aari ng isang partikular na pagtatangkang kumonekta. Dagdagan ang generation counter kapag nagsimula ang bagong pagtatangka, kapag nawala ang channel, at kapag nag-ulat ang kliyente ng paglabas.

Isaalang-alang ang isang pagsubok na sinimulan habang konektado ang A. Bumabagsak ang tunel, nagsisimula ang koneksyon B, at pagkatapos ay dumarating ang naantalang HTTP na tagumpay ng A. Kung walang guard, ginagawang berde ng lumang resultang iyon ang display habang nagpapatotoo pa ang B. Binabawasan ng pagkansela ang nasayang na trabaho, at ang pagsusuri ng generation ang humahadlang sa lumang pagkumpleto na maging kasalukuyang estado:

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

Ilapat ang parehong tuntunin sa paligid ng pagpapadala sa UI, dahil maaaring dumating ang marshalled na update pagkatapos na umusad ang generation.

Ang initialization at muling pagkonekta ay isang lifecycle

Ituring ang unang koneksyon, muling pagkonekta at pagkawala ng channel bilang isang lifecycle na may isang set ng mga tuntunin:

  • Basahin ang kasalukuyang estado at mag-subscribe sa mga abiso sa isang hakbang kung saan pinapayagan ng interface.
  • I-tag ang bawat obserbasyon ng pagkakakilanlan ng koneksyon at ng generation.
  • Ipawalang-bisa ang kahandaan sa muling pagkonekta, paglabas, o nawalang channel ng obserbasyon.
  • Subukan ang pribadong resource pagkatapos lamang iulat ng may-ari na kumpleto na ang initialization.
  • Ilathala lamang ang mga resultang kabilang pa sa kasalukuyang generation.

Ang nawalang channel ay nangangahulugang hindi alam, hindi nadiskonekta. Ang pag-uulat ng hindi alam ay mas tapat kaysa sa pag-uulat ng pagkadiskonekta na hindi mo mapapatunayan, at pumipigil ito sa retry logic na kumilos batay sa haka-haka.

Iulat ang ebidensiya, hindi boolean

Ibalik ang pinangalanang estado ng sesyon at ang kahandaan ng resource bilang magkahiwalay na halaga, bawat isa ay may edad. Ang consumer na kailangang magpasya ng isang bagay ay makikita na ang huling matagumpay na pagsubok ay apatnapung segundo ang edad, na ibang impormasyon kaysa sa sariwang impormasyon.

Ang paghahanap ng pampublikong IP ay hindi ebidensiya na gumamit ang pribadong API ng kinakailangang ruta, kaya huwag itong ipakita na parang gayon.

Panatilihin ang pagpapatupad sa labas ng observer

Ang callback ay tumatakbo pagkatapos ng pangyayari. Hindi nito magagarantiya na walang packet na umalis sa makina sa pagitan ng kaganapan at ng handler. Kung kailangan ng disenyo ang pagharang, dapat itong ibigay ng patakaran ng network, at ang trabaho ng observer ay ipaliwanag ang ebidensiya sa tumatawag nito. Ang paghahalo ng dalawa ay gumagawa ng code na inaakalang firewall ito dahil may boolean ito. Panatilihing boring at nasusubok ang layer ng pagpapatupad, at hayaang manatiling mambabasa ang observer.

Pagkatapos ang tanong sa UI ay nagiging simple: ipakita ang alam, kasama ang edad nito, at sabihing hindi alam kapag ganoon.

Kaugnay na mga artikulo