Aplikasi anda terus berfungsi semasa terowong mati. Wi-Fi masih hidup, internet masih menjawab, dan API peribadi yang menjadi sandaran aplikasi telah menjadi tidak boleh dicapai. Peristiwa .NET yang biasanya dituju orang di sini, NetworkAvailabilityChanged, sama sekali tidak menerangkan keadaan itu. Ia melaporkan perubahan dalam keadaan agregat mesin, dan keadaan itu boleh kekal benar sepanjang pemutusan dan penyambungan semula VPN. Pemerhati mesti memantau klien yang memiliki terowong, bukan ringkasan tindanan rangkaian tentangnya.

Ketersediaan ialah agregat, bukan terowong anda

NetworkAvailabilityChanged dicetuskan apabila jawapan ketersediaan agregat mesin berubah, dan jawapan itu mengira setiap antara muka aktif selain loopback atau terowong.

Putusnya VPN semasa Wi-Fi hidup tidak mengubah apa-apa yang diukurnya, sebab itulah peristiwa itu boleh kekal senyap tepat semasa kegagalan yang anda ambil peduli.

Aliran status milik klien yang memiliki terowong

Kenal pasti komponen yang memiliki sambungan: GUI atau perkhidmatan OpenVPN, OpenVPN Connect, atau proses yang dimulakan dan dikawal oleh aplikasi anda. Ini pemilik berbeza dengan antara muka sokongan berbeza, dan pemerhati mesti menggunakan yang sepadan dengan penggunaan. Bagi proses OpenVPN yang anda dibenarkan untuk berintegrasi dengannya, antara muka pengurusan melaporkan keadaan semasa, sejarah dan pemberitahuan masa nyata. Analisis mesej berstruktur yang didokumenkan dan bukannya mencari perkataan connected dalam kapsyen GUI yang disetempatkan.

Saluran pengurusan ialah permukaan kawalan istimewa, jadi jangan buka pendengar baharu atau bertengkar dengan GUI untuk saluran yang sudah dipegangnya.

Pengawal generasi menghentikan hasil lapuk

Setiap pemerhatian milik percubaan sambungan tertentu. Tingkatkan pembilang generasi apabila percubaan baharu bermula, apabila saluran hilang dan apabila klien melaporkan keluar.

Pertimbangkan pemeriksaan yang dimulakan semasa sambungan A. Terowong jatuh, sambungan B bermula, dan kemudian kejayaan HTTP A yang tertunda tiba. Tanpa pengawal, hasil lama itu menjadikan paparan hijau sedangkan B masih mengesahkan. Pembatalan mengurangkan kerja terbuang, dan semakan generasi itulah yang menghalang penyiapan lapuk daripada menjadi keadaan semasa:

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

Terapkan peraturan yang sama di sekeliling penghantaran ke UI, kerana kemas kini yang dimarsyal boleh tiba selepas generasi bergerak ke hadapan.

Permulaan dan penyambungan semula ialah satu kitaran hayat

Anggap sambungan pertama, penyambungan semula dan kehilangan saluran sebagai satu kitaran hayat dengan satu set peraturan:

  • Baca keadaan semasa dan langgan pemberitahuan dalam satu langkah di tempat antara muka membenarkannya.
  • Tandakan setiap pemerhatian dengan identiti sambungan dan generasi.
  • Batalkan kesediaan pada penyambungan semula, keluar atau saluran pemerhatian yang hilang.
  • Periksa sumber peribadi hanya selepas pemilik melaporkan permulaan selesai.
  • Terbitkan hanya hasil yang masih milik generasi semasa.

Saluran yang hilang bermaksud tidak diketahui, bukan terputus. Melaporkan tidak diketahui lebih jujur daripada melaporkan pemutusan yang tidak dapat anda buktikan, dan ia menghalang logik cubaan semula daripada bertindak atas andaian.

Laporkan bukti, bukan boolean

Kembalikan status sesi bernama dan kesediaan sumber sebagai nilai berasingan, masing-masing membawa umur. Pengguna yang perlu memutuskan sesuatu kemudian dapat melihat bahawa pemeriksaan berjaya terakhir berusia empat puluh saat, yang merupakan maklumat berbeza daripada yang segar.

Carian IP awam bukan bukti bahawa API peribadi menggunakan laluan yang diperlukan, jadi jangan menyampaikannya seolah-olah begitu.

Kekalkan penguatkuasaan di luar pemerhati

Panggilan balik berjalan selepas kejadian. Ia tidak dapat menjamin tiada paket meninggalkan mesin antara peristiwa dan pengendali. Jika reka bentuk memerlukan penyekatan, dasar rangkaian mesti menyediakannya, dan tugas pemerhati ialah menerangkan bukti kepada pemanggilnya. Mencampurkan kedua-duanya menghasilkan kod yang menyangka dirinya tembok api kerana memegang boolean. Kekalkan lapisan penguatkuasaan membosankan dan boleh diuji, dan biarkan pemerhati kekal sebagai pembaca.

Kemudian persoalan UI menjadi mudah: tunjukkan apa yang diketahui, berserta umurnya, dan katakan tidak diketahui apabila memang begitu.

Artikel berkaitan