Вашата апликација продолжува да работи додека тунелот умира. Wi-Fi е сѐ уште вклучен, интернетот сѐ уште одговара, а приватниот API од кој зависи апликацијата стана недостапен. .NET настанот кон кој луѓето обично посегнуваат тука, NetworkAvailabilityChanged, воопшто не ја опишува таа состојба. Тој пријавува промена во збирната состојба на машината, и таа состојба може да остане вистинита низ исклучување и повторно поврзување на VPN. Набљудувачот мора да го следи клиентот што го поседува тунелот, а не резимето на мрежниот стек за него.

Достапноста е збирна вредност, не вашиот тунел

NetworkAvailabilityChanged се активира кога збирниот одговор за достапност на машината ќе се промени, и тој одговор го брои секој активен интерфејс освен loopback или тунел.

Пад на VPN додека Wi-Fi е активен не менува ништо од она што го мери, затоа настанот може да остане тивок токму за време на дефектот што ве интересира.

Текот на состојбата му припаѓа на клиентот што го поседува тунелот

Определете која компонента ја поседува врската: OpenVPN GUI или службата, OpenVPN Connect, или процес што вашата апликација го стартувала и го контролира. Тоа се различни сопственици со различни поддржани интерфејси, и набљудувачот мора да го користи оној што одговара на распоредувањето. За OpenVPN процес со кој имате овластување да се интегрирате, интерфејсот за управување ја пријавува тековната состојба, историјата и известувањата во реално време. Анализирајте ги документираните структурирани пораки наместо да го барате зборот connected во локализиран GUI натпис.

Каналот за управување е привилегирована контролна површина, затоа не отворајте нов слушател и не се расправајте со GUI за канал што тој веќе го држи.

Генерациските стражари запираат застарени резултати

Секое набљудување припаѓа на одреден обид за поврзување. Зголемете го бројачот на генерацијата кога почнува нов обид, кога се губи каналот и кога клиентот пријавува излез.

Земете проверка започната за време на врската A. Тунелот паѓа, врската B почнува, а потоа пристигнува одложениот HTTP успех на A. Без стражарот, тој стар резултат го прави екранот зелен додека B сѐ уште се автентицира. Откажувањето го намалува залудното работење, а генерациската проверка е она што спречува застарено завршување да стане тековна состојба:

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

Применете го истото правило околу испраќањето кон UI, бидејќи маршалираното ажурирање може да пристигне откако генерацијата отишла понатаму.

Иницијализацијата и повторното поврзување се еден животен циклус

Третирајте го првото поврзување, повторното поврзување и губењето на каналот како еден животен циклус со еден збир правила:

  • Прочитајте ја тековната состојба и претплатете се на известувања во еден чекор каде интерфејсот тоа го дозволува.
  • Означете го секое набљудување со идентитетот на врската и генерацијата.
  • Поништете ја подготвеноста при повторно поврзување, излез или изгубен канал за набљудување.
  • Проверете го приватниот ресурс само откако сопственикот ќе пријави дека иницијализацијата е завршена.
  • Објавувајте само резултати што сѐ уште ѝ припаѓаат на тековната генерација.

Изгубен канал значи непознато, а не исклучено. Пријавувањето непознато е поискрено отколку пријавување исклучување што не можете да го докажете, и спречува логиката за повторен обид да дејствува врз претпоставка.

Пријавете докази, не булова вредност

Вратете ја именуваната состојба на сесијата и подготвеноста на ресурсот како одделни вредности, секоја со возраст. Потрошувачот што треба да одлучи нешто тогаш може да види дека последната успешна проверка е стара четириесет секунди, што е различна информација од свежа.

Пребарувањето јавна IP не е доказ дека приватен API ја користел потребната рута, затоа не го претставувајте како да е.

Држете го спроведувањето надвор од набљудувачот

Повратниот повик се извршува откако ќе се случи настанот. Не може да гарантира дека ниту еден пакет не ја напуштил машината помеѓу настанот и ракувачот. Ако дизајнот бара блокирање, мрежната политика мора да го обезбеди тоа, а задачата на набљудувачот е да ги објасни доказите на својот повикувач. Мешањето на двете создава код што мисли дека е firewall затоа што држи булова вредност. Држете го слојот за спроведување досаден и тестиран, а набљудувачот нека остане читател.

Тогаш UI прашањето станува едноставно: покажете што е познато, со неговата возраст, и кажете непознато кога е така.

Поврзани статии