Πρόσφατα, όταν δούλευα σε ένα έργο, ορισμένες σελίδες έπρεπε να φορτώσουν πολλά δεδομένα και μερικές φορές, έκανα κλικ στη σελίδα χωρίς να περιμένω να ολοκληρωθεί η φόρτωση της σελίδας και μετά έκανα ξανά κλικ σε άλλη σελίδα
Θα υπάρχει μια πολύ αργή κατάσταση αναστολής κινούμενων εικόνων κατά τη φόρτωση της ιστοσελίδας, οπότε ας τη μελετήσουμε προσεκτικά σήμερα.
Στην αρχή, νόμιζα ότι αυτή η κατάσταση θα συνέβαινε σε πολλούς ιστότοπους ή στο πρόβλημα ταχύτητας του δικτύου του υπολογιστή μου, αλλά διαπίστωσα ότι αυτός ο ιστότοπος δεν είχε αυτήν την κατάσταση, μερικές φορές, κολλούσα όταν δημοσίευα, αλλά έκανα κλικ σε άλλες σελίδες στην καρτέλα για γρήγορη φόρτωση.
Ας ρίξουμε μια πιο προσεκτική ματιά σήμερα!! Ο κώδικας που δοκιμάστηκε πρώτος:
Κωδικός Homeview:
Κωδικός Ελεγκτή:
Για την ανάλυση κώδικα δοκιμής, ο ελεγκτής μας έχει 3 μεθόδους, η μία είναι η αρχική σελίδα και οι άλλες δύο είναι μέθοδοι δοκιμής
Το αίτημα Test1 αποκλείει για 5 δευτερόλεπτα και στη συνέχεια επιστρέφει δεδομένα στον χρήστη
Τα αιτήματα δοκιμής 2 δεν θα αποκλείσουν και θα επιστρέψουν δεδομένα απευθείας στον χρήστη
Η αρχική μας σελίδα είναι δύο διεπαφές για αιτήματα Ajax, τα οποία είναι ασύγχρονα αιτήματα, επομένως δεν υπάρχει πρόβλημα αποκλεισμού.
Θα διαπιστώσουμε ότι η μέθοδος Test1 εξάγει περιεχόμενο μόνο αφού η Test2 εξάγει περιεχόμενο (Κανονικά, η σελίδα θα εξάγει απευθείας το περιεχόμενο που επιστρέφεται από το Test2 και, στη συνέχεια, θα περιμένει 5 δευτερόλεπτα για να εξάγει το περιεχόμενο που επιστρέφεται από το Test1, επειδή το js δεν αποκλείει)
Στη συνέχεια, έχουμε απευθείας πρόσβαση στις διεπαφές Test1 και Test2, έχουμε πρόσβαση πρώτα στο Test1 και, στη συνέχεια, έχουμε άμεση πρόσβαση στο Test2 και διαπιστώνουμε ότι το Test2 πρέπει να περιμένει μέχρι να επιστρέψει το Test1 για να ολοκληρωθεί, όπως φαίνεται στο παρακάτω σχήμα:
Εάν μια αίτηση σελίδας ορίζει ένα κλείδωμα αναγνώστη, άλλες αιτήσεις που υποβάλλονται σε επεξεργασία ταυτόχρονα στην ίδια περίοδο λειτουργίας δεν θα μπορούν να ενημερώσουν την κατάσταση της συνεδρίας, αλλά τουλάχιστον μπορούν να διαβαστούν. Εάν μια σελίδα ζητήσει κλείδωμα εγγραφής για την κατάσταση της συνεδρίας, τότε όλες οι άλλες σελίδες αποκλείονται, ανεξάρτητα από το αν θέλουν να διαβάσουν ή να γράψουν περιεχόμενο. Για παράδειγμα, εάν δύο προβολές προγράμματος εγγράφουν περιεχόμενο στην ίδια περίοδο λειτουργίας ταυτόχρονα, το ένα πρόγραμμα πρέπει να περιμένει μέχρι να ολοκληρωθεί το άλλο πρόγραμμα για να μπορέσει να γραφτεί. Στον προγραμματισμό AJAX, είναι σημαντικό να γνωρίζετε ότι συμβαίνει αυτό.
Ειδική σημείωση: Μόνο κατά τη σύνταξη μιας συνεδρίας, Asp.net θα αποκλείσει το αίτημα, αλλά εφόσον έχετε επισκεφτεί τη σελίδα όπου είναι γραμμένη η περίοδος σύνδεσης, όπως η λειτουργία μετά τη σύνδεση στο σύστημα με τη συνεδρία (η συνεδρία είναι κλειδωμένη μέχρι να λήξει, φυσικά, είναι μόνο η περίπτωση που το SessionID είναι το ίδιο). Θα υπάρξει αυτό το πρόβλημα.
Πληροφορίες Netizen
Εφόσον ο ιστότοπος χρησιμοποιεί μια περίοδο λειτουργίας, κάθε αίτημα θα κλειδώνει τη συνεδρία καθ' όλη τη διάρκεια ζωής της, έτσι ώστε τα αιτήματα με το ίδιο αναγνωριστικό συνεδρίας να πρέπει να περιμένουν να ξεκλειδωθούν
Αυτό σημαίνει ότι εάν ο ιστότοπος έχει μια σελίδα που έχει λήξει, δεν μπορεί να κάνει τίποτα και πρέπει να περιμένετε να φορτώσει η χρονομετρημένη σελίδα.
Ούτε εσύ μπορείς να το κάνεις, πολλαπλά ajax ταυτόχρονα αιτήματα στην ίδια σελίδα, δεν μπορείς να το κάνεις, αιτήματα δημοσκόπησης μηνυμάτων.
Για να το συνοψίσουμε:Εάν κάνετε μια συνεδρία στο αίτημα, εάν δεν φέρετε μια συνεδρία στο αίτημα, η παραπάνω κατάσταση δεν θα συμβεί
Λύση:
Προστέθηκε η δυνατότητα SessionState (System.Web.SessionState.SessionStateBehavior.ReadOnly) στον ελεγκτή
Σημείωση:
Απαιτείται σημαίνει ότι ζητάτε αποκλειστικό κλείδωμα στο Session (δηλαδή δεν υπάρχει παράλληλη επεξεργασία αιτημάτων για το ίδιο sessionID) Μόνο για ανάγνωση σημαίνει ότι ζητάτε ένα μη αποκλειστικό κλείδωμα στο Session (δηλαδή το αίτημά σας πρέπει ακόμα να περιμένει να ολοκληρωθούν τα αιτήματα με αποκλειστικό κλείδωμα, αλλά μπορείτε να επεξεργαστείτε αιτήματα με μη αποκλειστικό κλείδωμα κλειδαριές παράλληλα. Ωστόσο, εναπόκειται σε εσάς να διασφαλίσετε ότι ο κώδικάς σας δεν γράφει στο Session. Δεν επιβάλλεται απαραίτητα από το πλαίσιο) Απαιτείται σημαίνει το mutex συνεδρίας που ζητήσατε (δηλαδή δεν απαιτείται η παράλληλη επεξεργασία του ίδιου SessionID)
Μόνο για ανάγνωση σημαίνει ότι η περίοδος λειτουργίας που ζητάτε είναι ένα μη αποκλειστικό κλείδωμα (δηλαδή το αίτημά σας πρέπει ακόμα να περιμένει για ολοκλήρωση, το αίτημα για αποκλειστικό κλείδωμα, αλλά μπορείτε να επεξεργαστείτε ένα αίτημα με ένα παράλληλο μη αποκλειστικό κλείδωμα). Αλλά θέλετε να βεβαιωθείτε ότι ο κώδικάς σας δεν γράφει συνεδρίες. Δεν χρειάζεται να εκτελεστεί από το πλαίσιο)
|