Tətbiqiniz tunel ölərkən işləməyə davam edir. Wi-Fi hələ də işləyir, internet hələ də cavab verir və tətbiqin asılı olduğu şəxsi API əlçatmaz olub. İnsanların burada adətən müraciət etdiyi .NET hadisəsi, NetworkAvailabilityChanged, bu vəziyyəti ümumiyyətlə təsvir etmir. O, maşının ümumi vəziyyətində dəyişiklik bildirir və bu vəziyyət VPN bağlantısı kəsiləndə və yenidən qurulanda da doğru qala bilər. Müşahidəçi tunelin sahibi olan müştəriyə baxmalıdır, şəbəkə yığınının onun haqqındakı xülasəsinə deyil.

Əlçatanlıq ümumi göstəricidir, sizin tuneliniz deyil

NetworkAvailabilityChanged maşının ümumi əlçatanlıq cavabı dəyişdikdə işə düşür və o cavab loopback və ya tuneldən başqa istənilən qalxmış interfeysi sayır.

Wi-Fi işləyərkən VPN-in düşməsi onun ölçdüyü heç nəyi dəyişmir; buna görə hadisə sizi narahat edən dəqiq nasazlıq boyunca səssiz qala bilər.

Vəziyyət axını tunelin sahibi olan müştəriyə aiddir

Bağlantının hansı komponentə aid olduğunu müəyyənləşdirin: OpenVPN GUI və ya xidməti, OpenVPN Connect, yoxsa tətbiqinizin başladıb idarə etdiyi proses. Bunlar fərqli dəstəklənən interfeysləri olan fərqli sahiblərdir və müşahidəçi yerləşdirməyə uyğun olanı istifadə etməlidir. İnteqrasiya üçün icazə verdiyiniz OpenVPN prosesi üçün idarəetmə interfeysi cari vəziyyəti, tarixçəni və real vaxt bildirişlərini bildirir. Lokallaşdırılmış GUI başlığında connected sözünü axtarmaq əvəzinə sənədləşdirilmiş strukturlaşdırılmış mesajları təhlil edin.

İdarəetmə kanalı imtiyazlı idarəetmə səthidir, ona görə yeni dinləyici açmayın və artıq malik olduğu kanal üçün GUI ilə çəkişməyin.

Nəsil qoruyucuları köhnə nəticələri dayandırır

Hər müşahidə müəyyən bir bağlantı cəhdinə aiddir. Yeni cəhd başlayanda, kanal itəndə və müştəri çıxış bildirəndə nəsil sayğacını artırın.

A bağlantısı zamanı başlayan yoxlamanı nəzərdən keçirin. Tunel düşür, B bağlantısı başlayır və A-nın gecikmiş HTTP uğuru sonra gəlir. Qoruyucu olmadan, həmin köhnə nəticə B hələ autentifikasiya olunarkən ekranı yaşıl edir. Ləğvetmə boşa gedən işi azaldır və nəsil yoxlaması köhnəlmiş tamamlanmanın cari vəziyyətə çevrilməsinin qarşısını alan şeydir:

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

Eyni qaydanı UI göndərişi ətrafında tətbiq edin, çünki ötürülən yeniləmə nəsil irəlilədikdən sonra gələ bilər.

İnisiallaşdırma və yenidən qoşulma bir həyat dövrüdür

İlk qoşulmanı, yenidən qoşulmanı və kanal itkisini vahid qaydalar dəsti ilə bir həyat dövrü kimi qəbul edin:

  • Cari vəziyyəti oxuyun və interfeys imkan verdikdə bildirişlərə bir addımda abunə olun.
  • Hər müşahidəni bağlantı kimliyi və nəsillə işarələyin.
  • Yenidən qoşulmada, çıxışda və ya itirilmiş müşahidə kanalında hazırlığı etibarsız sayın.
  • Şəxsi resursu yalnız sahib inisiallaşdırmanın tamamlandığını bildirdikdən sonra yoxlayın.
  • Yalnız cari nəslə hələ aid olan nəticələri dərc edin.

İtirilmiş kanal naməlum deməkdir, əlaqəsiz deyil. Naməlum bildirmək sübut edə bilmədiyiniz əlaqə kəsilməsini bildirməkdən daha dürüstdür və yenidən cəhd məntiqinin təxminə əsaslanmasının qarşısını alır.

Sübut bildirin, boolean deyil

Adlandırılmış sessiya vəziyyətini və resurs hazırlığını hər biri yaş daşıyan ayrı dəyərlər kimi qaytarın. Qərar verməli olan istehlakçı son uğurlu yoxlamanın qırx saniyə yaşında olduğunu görə bilər ki, bu təzə məlumatdan fərqli məlumatdır.

İctimai IP axtarışı şəxsi API-nin tələb olunan marşrutu istifadə etdiyinə sübut deyil, ona görə onu elə təqdim etməyin.

İcraetməni müşahidəçidən kənarda saxlayın

Geri çağırış hadisədən sonra işləyir. Hadisə ilə işləyici arasında maşından heç bir paketin çıxmadığına zəmanət verə bilməz. Dizayn bloklama tələb edirsə, şəbəkə siyasəti bunu təmin etməlidir və müşahidəçinin vəzifəsi sübutları çağırana izah etməkdir. İkisini qarışdırmaq boolean saxladığı üçün özünü firewall hesab edən kod yaradır. İcraetmə qatını darıxdırıcı və sınaqdan keçirilə bilən saxlayın və müşahidəçi oxucu olaraq qalsın.

Onda UI sualı sadələşir: bilinəni yaşı ilə göstər və bilinməyəndə naməlum olduğunu de.

Əlaqəli məqalələr