C# OpenVPN მდგომარეობის დამკვირვებელი: აკონტროლეთ სესია და არა ქსელის ბარათი
NetworkAvailabilityChanged არ არის VPN მოვლენა. წაიკითხეთ გვირაბის მფლობელი კლიენტის მდგომარეობის ნაკადი, დაიცავით თავი მოძველებული შემოწმებებისგან და გამოაქვეყნეთ მზადყოფნა თითოეული კავშირისთვის.
თქვენი აპლიკაცია აგრძელებს მუშაობას, სანამ გვირაბი კვდება. Wi-Fi ჯერ კიდევ ჩართულია, ინტერნეტი ჯერ კიდევ პასუხობს, და კერძო API, რომელზეც აპლიკაციაა დამოკიდებული, მიუწვდომელი გახდა. .NET მოვლენა, რომელსაც აქ ადამიანები ჩვეულებრივ მიმართავენ, NetworkAvailabilityChanged, საერთოდ არ აღწერს ამ სიტუაციას. ის აცნობებს მანქანის საერთო მდგომარეობის ცვლილებას და ეს მდგომარეობა შეიძლება ჭეშმარიტი დარჩეს VPN-ის გათიშვისა და ხელახლა დაკავშირების განმავლობაში. დამკვირვებელმა უნდა აკონტროლოს კლიენტი, რომელსაც გვირაბი ეკუთვნის და არა ქსელის დასტის შეჯამება.
ხელმისაწვდომობა აგრეგატია, არა თქვენი გვირაბი
NetworkAvailabilityChanged აქტიურდება, როცა იცვლება მანქანის აგრეგირებული ხელმისაწვდომობის პასუხი და ეს პასუხი ითვლის ნებისმიერ აქტიურ ინტერფეისს loopback-ის ან გვირაბის გარდა.
VPN-ის ვარდნა Wi-Fi-ის ჩართულობისას არაფერს ცვლის იმაში, რასაც ის ზომავს, ამიტომ მოვლენა შეიძლება გაჩუმდეს ზუსტად იმ ხარვეზის დროს, რომელიც გაწუხებთ.
მდგომარეობის ნაკადი ეკუთვნის კლიენტს, რომელსაც გვირაბი ეკუთვნის
განსაზღვრეთ, რომელი კომპონენტი ფლობს კავშირს: OpenVPN GUI ან სერვისი, OpenVPN Connect, თუ პროცესი, რომელიც თქვენმა აპლიკაციამ გაუშვა და აკონტროლებს. ესენი სხვადასხვა მფლობელები არიან სხვადასხვა მხარდაჭერილი ინტერფეისით და დამკვირვებელმა უნდა გამოიყენოს განლაგების შესაბამისი. OpenVPN პროცესისთვის, რომელთან ინტეგრაციის უფლებაც გაქვთ, მართვის ინტერფეისი აცნობებს მიმდინარე მდგომარეობას, ისტორიას და რეალურ დროში შეტყობინებებს. გააანალიზეთ დოკუმენტირებული სტრუქტურირებული შეტყობინებები და ნუ მოძებნით connected სიტყვას ლოკალიზებულ GUI-ის წარწერაში.
მართვის არხი პრივილეგირებული კონტროლის ზედაპირია, ამიტომ ნუ გახსნით ახალ მსმენელს და ნუ ეცილებით GUI-ს იმ არხისთვის, რომელიც მას უკვე აქვს.
თაობის დამცველები აჩერებენ მოძველებულ შედეგებს
ყოველი დაკვირვება კონკრეტულ კავშირის მცდელობას ეკუთვნის. გაზარდეთ თაობის მთვლელი, როცა იწყება ახალი მცდელობა, როცა არხი იკარგება და როცა კლიენტი აცნობებს გასვლას.
განვიხილოთ შემოწმება, რომელიც დაიწყო A კავშირის დროს. გვირაბი ვარდება, იწყება B კავშირი და შემდეგ მოდის A-ის დაგვიანებული HTTP წარმატება. დამცველის გარეშე ეს ძველი შედეგი ეკრანს მწვანედ აქცევს, სანამ B ჯერ კიდევ ავთენტიფიკაციას გადის. გაუქმება ამცირებს დაკარგულ სამუშაოს და თაობის შემოწმება არის ის, რაც ხელს უშლის მოძველებულ დასრულებას გახდეს მიმდინარე მდგომარეობა:
var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);
გამოიყენეთ იგივე წესი UI-ის გაგზავნის ირგვლივ, რადგან მარშალირებული განახლება შეიძლება მოვიდეს მას შემდეგ, რაც თაობა წინ წავიდა.
ინიციალიზაცია და ხელახლა დაკავშირება ერთი სასიცოცხლო ციკლია
პირველი დაკავშირება, ხელახლა დაკავშირება და არხის დაკარგვა განიხილეთ როგორც ერთი სასიცოცხლო ციკლი ერთი წესების ნაკრებით:
- წაიკითხეთ მიმდინარე მდგომარეობა და გამოიწერეთ შეტყობინებები ერთ ნაბიჯში, სადაც ინტერფეისი იძლევა საშუალებას.
- მონიშნეთ ყოველი დაკვირვება კავშირის იდენტობით და თაობით.
- გააუქმეთ მზადყოფნა ხელახლა დაკავშირებისას, გასვლისას ან დაკარგული დაკვირვების არხისას.
- შეამოწმეთ კერძო რესურსი მხოლოდ მას შემდეგ, რაც მფლობელი აცნობებს ინიციალიზაციის დასრულებას.
- გამოაქვეყნეთ მხოლოდ ის შედეგები, რომლებიც ჯერ კიდევ მიმდინარე თაობას ეკუთვნის.
დაკარგული არხი ნიშნავს უცნობს და არა გათიშულს. უცნობის შესახებ შეტყობინება უფრო პატიოსანია, ვიდრე გათიშვის შესახებ, რომლის დამტკიცებაც არ შეგიძლიათ, და ეს ხელს უშლის ხელახალი ცდის ლოგიკას იმოქმედოს ვარაუდზე.
შეატყობინეთ მტკიცებულებები და არა ლოგიკური მნიშვნელობა
დააბრუნეთ დასახელებული სესიის მდგომარეობა და რესურსის მზადყოფნა ცალკე მნიშვნელობებად, თითოეული ასაკით. მომხმარებელს, რომელმაც რაღაც უნდა გადაწყვიტოს, შეუძლია დაინახოს, რომ ბოლო წარმატებული შემოწმების ასაკი ორმოცი წამია, რაც განსხვავებული ინფორმაციაა ახლისგან.
საჯარო IP-ის ძებნა არ არის მტკიცებულება იმისა, რომ კერძო API-მ გამოიყენა საჭირო მარშრუტი, ამიტომ ნუ წარმოადგენთ მას ისე, თითქოს ასეა.
შეინახეთ აღსრულება დამკვირვებლის გარეთ
გამოძახება მუშაობს ფაქტის შემდეგ. მას არ შეუძლია გარანტიორად თქვას, რომ მოვლენასა და დამმუშავებელს შორის მანქანიდან არცერთი პაკეტი არ გასულა. თუ დიზაინი ბლოკირებას მოითხოვს, ის უნდა უზრუნველყოს ქსელურმა პოლიტიკამ და დამკვირვებლის საქმეა მტკიცებულებები აუხსნას თავის გამომძახებელს. ორივეს შერევა ქმნის კოდს, რომელიც თავს ფაირვოლად მიიჩნევს, რადგან ლოგიკურ მნიშვნელობას ინახავს. შეინახეთ აღსრულების ფენა მოსაწყენად და ტესტირებადად და მიეცით დამკვირვებელს მკითხველად დარჩენის საშუალება.
მაშინ UI-ის კითხვა მარტივი ხდება: აჩვენეთ რაც ცნობილია, მისი ასაკით, და თქვით უცნობია, როცა ასეა.