Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 16746|Απάντηση: 0

[ASP.NET] [Μύθος] Η μέθοδος Init αντικειμένου HttpApplication θα εκτελεστεί μόνο μία φορά;

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 6/2/2017 5:29:28 μ.μ. | | | |
Διαπίστωσα ότι πολλοί φίλοι, όπως εγώ, χρησιμοποίησαν κατά λάθος το IHttpModule.Init ως Application_Start εναλλακτική λύση για να κάνουν κάποιες λειτουργίες προετοιμασίας εφαρμογών σε αυτό.
Ωστόσο, η φύση των συμβάντων Application_Start στο IHttpModule.Init και στο Global.asax είναι διαφορετική και το IHttpModule.Init δεν μπορεί να χρησιμοποιηθεί απευθείας για να αντικαταστήσει Application_Start ASP.NET τη διαδικασία προετοιμασίας της εφαρμογής. Ούτε μπορεί απλώς να χρησιμοποιηθεί για να συμπεράνει ότι η μέθοδος Init καλείται επανειλημμένα να συμπεράνει ότι ASP.NET πρόγραμμα έχει επανεκκινηθεί.
Ο λόγος είναι ότι το IHttpModule.Init μπορεί να κληθεί πολλές φορές όταν απαντάτε σε ένα αίτημα ASP.NET και είναι πολύ πιθανό να συμβεί κατά τη διάρκεια της πραγματικής λειτουργίας του ιστότοπου.
Γιατί καλείται το IHttpModule.Init πολλές φορές επειδή κάθε παρουσία HttpApplication μπορεί να χειριστεί μόνο ένα αίτημα κάθε φορά και ASP.NET υποστηρίζει έναν ορισμένο αριθμό ταυτόχρονων αιτημάτων, επομένως η παρουσία HttpApplication θα δημιουργηθεί πολλές φορές για να απαντήσει σε διαφορετικά αιτήματα όταν δεν αρκεί να απαντήσει σε ταυτόχρονα αιτήματα. Κάθε παρουσία HttpApplication δημιουργεί ένα νέο σύνολο HttpModules και καλεί τη μέθοδο Init μετά τη δημιουργία της.
Application_Start θα κληθούν μόνο μετά τη δημιουργία του πρώτου αντικειμένου HttpApplication και οι επόμενες παρουσίες HttpApplication δεν θα ενεργοποιήσουν αυτό το συμβάν.
Νομίζω ότι η επαναχρησιμοποίηση των περιπτώσεων του HttpApplication είναι ένας σημαντικός λόγος για την παρανόηση της χρήσης της μεθόδου Init του IHttpModule, επειδή συνήθως έχουμε μόνο ένα αίτημα κατά τον εντοπισμό σφαλμάτων ενός προγράμματος και είναι βασικά αδύνατο να εκτελέσουμε επανειλημμένα τη μέθοδο Init του HttpModule. Στο πραγματικό περιβάλλον λειτουργίας του ιστότοπου, τα ταυτόχρονα αιτήματα είναι κοινά και εάν γίνει κακή χρήση της μεθόδου Init, μπορεί να προκαλέσει περίεργα προβλήματα στο πραγματικό περιβάλλον.
Για συγκεκριμένες λεπτομέρειες, ανατρέξτε στην ενότητα "Επισκόπηση του κύκλου ζωής της εφαρμογής ASP.NET για τις υπηρεσίες IIS 5.0 και 6.0" του MSDN, η οποία παρέχει εικόνες στο άρθρο:
Μπορείτε επίσης να χρησιμοποιήσετε το Refelector για να απομεταγλωττίσετε τη συγκρότηση System.Web και να αναλύσετε τη σχέση κλήσης της μεθόδου IHttpModule.Init.
Θα καταλήξετε με τη μέθοδο System.Web.HttpApplicationFactory.GetNormalApplicationInstance, η οποία δείχνει πώς επαναχρησιμοποιούνται και δημιουργούνται οι παρουσίες του HttpApplication.
Συνοπτικά, το IHttpModule.Init δεν μπορεί απλώς να χρησιμοποιηθεί ως αντικατάσταση του Application_Start.
Ένας σχετικά απλός τρόπος είναι να χρησιμοποιήσετε ένα στατικό πεδίο τύπου bool ως ετικέτα αρχικοποίησης και να ορίσετε το σημάδι σε true μετά την αρχικοποίηση που απαιτείται από το πρόγραμμα στο HttpModule και να μην επαναλάβετε την προετοιμασία την επόμενη φορά.
Ωστόσο, κώδικας όπως η εγγραφή του συμβάντος BeginRequest εξακολουθεί να πρέπει να εκτελείται κάθε φορά που εκτελείται το Init, επειδή η παρουσία του HttpModule αυτή τη στιγμή είναι διαφορετική, εάν κρίνετε το πεδίο σήμανσης στατικής προετοιμασίας χωρίς να επαναλάβετε το συμβάν εγγραφής, θα οδηγήσει σε περίεργα προβλήματα όπως η επανεγγραφή URL μερικές φορές εκτελείται και μερικές φορές δεν εκτελείται.

[Μύθος] Η μέθοδος Init αντικειμένου HttpApplication θα εκτελεστεί μόνο μία φορά;

απάντηση: Θα εκτελεστεί πολλές φορές!!!!





Προηγούμενος:Χρησιμοποιήστε το InternalsVisibleTo για να προσθέσετε "συναρμολόγηση φίλου" στη συναρμολόγηση
Επόμενος:Διαγωνισμός Java regex για να επιλέξετε έναν όμορφο αριθμό
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com