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

Άποψη: 14905|Απάντηση: 1

[Διαδικτυακό API] ASP.Net Προσωρινή αποθήκευση εξόδου στο ASP.NET Web API

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 17/1/2019 4:40:51 μ.μ. | | |
1. Το Nuget εγκαθιστά το σχετικό dll

Web API 2: Install-Package Strathweb.CacheOutput.WebApi2
Web API 1: Install-Package Strathweb.CacheOutput

Δύο. Δημιουργήστε ένα νέο ActionFilterAttribute και παρακάμψτε τις σχετικές μεθόδους

    δημόσια κλάση WebApiOutputCacheAttribute : ActionFilterAttribute
    {
        Χρόνος προσωρινής αποθήκευσης/δευτερόλεπτο
        ιδιωτικό διεθνές _timespan;
        Χρόνος/δευτερόλεπτο cache υπολογιστή-πελάτη
        ιδιωτικό int _clientTimeSpan;
        Εάν αποθηκεύεται προσωρινά από ανώνυμους χρήστες
        ιδιωτικό bool _anonymousOnly?
        Προσωρινή αποθήκευση του κλειδιού ευρετηρίου
        ιδιωτική _cachekey χορδών?
        Αποθήκες προσωρινής αποθήκευσης
        ιδιωτική στατική μόνο για ανάγνωση ObjectCache WebApiCache = MemoryCache.Default;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = χρονικό διάστημα·
          _clientTimeSpan = clientTimeSpan;
          _anonymousOnly = ανώνυμοςΜόνο;
        }

//是否缓存
        private bool _isCacheable(HttpActionContext ac)
        {
             αν (_timespan > 0 & _clientTimeSpan > 0)
             {
                αν (_anonymousOnly)
                   αν (Thread.CurrentPrincipal.Identity.IsAuthenticated)
                         επιστροφή ψευδής?
               Αν (ακ. Request.Method == HttpMethod.Get) επιστρέφει true;
            }
           αλλιώς
           {
                ρίξε νέο InvalidOperationException("Λάθος ορίσματα");
           }
            επιστροφή ψευδής?
        }

        private CacheControlHeaderValue setClientCache()
        {
            var cachecontrol = νέα CacheControlHeaderValue();
            cachecontrol. MaxAge = Χρονικό διάστημα.FromSeconds(_clientTimeSpan);
            cachecontrol. MustRevalidate = αληθές;
            επιστροφή cachecontrol?
        }


//Action调用前执行的方法
        public override void OnActionExecuting(HttpActionContext ac)
        {
            αν (ac != null)
            {
                αν (_isCacheable(αγ))
                {
                    _cachekey = συμβολοσειρά. Join(":", νέα συμβολοσειρά[] { ac. Request.RequestUri.AbsolutePath, ακ. Request.Headers.Accept.FirstOrDefault(). ToString() });
                    αν (WebApiCache.Contains(_cachekey))
                    {
                        var val = (συμβολοσειρά)WebApiCache.Get(_cachekey);
                        αν (val != null)
                        {
                            ακ. Απόκριση = ac. Request.CreateResponse();
                            ακ. Response.Content = νέο StringContent(val);
                            var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct");
                            if (contenttype == null)
                                contenttype = νέα MediaTypeHeaderValue(_cachekey. Split(':')[1]);
                            ακ. Response.Content.Headers.ContentType = τύπος περιεχομένου;
                            ακ. Response.Headers.CacheControl = setClientCache();
                            επιστροφή;
                        }
                    }
                }
            }
            αλλιώς
            {
                ρίξε νέο ArgumentNullException("actionContext");
            }
        }


//Action调用后执行方法
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            αν (!( WebApiCache.Contains(_cachekey)))
            {
                var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Αποτέλεσμα;
                WebApiCache.Add(_cachekey, σώμα, DateTime.Now.AddSeconds(_timespan));
                WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan));
            }
            if (_isCacheable(actionExecutedContext.ActionContext))
                actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache();
        }

    }

3. Ο ελεγκτής πρέπει να προσθέσει την προσωρινή μνήμη στη μέθοδο Get για να προσθέσει το φίλτρο

     [WebApiOutputCache(120,60;false)]
        δημόσια συμβολοσειρά GetShoppingCart()
        {
            επιστροφή "Hello World"?
        }
Ξεκινήστε, παρατηρήστε το σημείο διακοπής και παρατηρήστε το αποτέλεσμα. Η όλη διαδικασία είναι: αρχικοποιήστε το φίλτρο προσωρινής μνήμης κατά την εκκίνηση και, στη συνέχεια, καλέστε τη μέθοδο Get με το φίλτρο που προστέθηκε, εισαγάγετε τη μέθοδο OnActionExecutioning, προσδιορίστε εάν υπάρχει σχετική προσωρινή μνήμη, εάν υπάρχει, επιστρέψτε το αποτέλεσμα απευθείας, εάν όχι, καλέστε την ενέργεια του ελεγκτή και, στη συνέχεια, καλέστε τη μέθοδο OnActionExecuted για να προσθέσετε το σχετικό ζεύγος κλειδιού-τιμής cache και ορίστε τον χρόνο λήξης της προσωρινής μνήμης για να επιστρέψετε το αποτέλεσμα.




Προηγούμενος:Καταργήστε την εγκατάσταση του πλεονάζοντος εργαλείου εφαρμογής win10
Επόμενος:"CSS World" από τον Zhang Xinxu azw3+mobi+epub
Δημοσιεύτηκε στις 19/1/2019 9:09:45 π.μ. |
Καλό
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com