Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 14395|Antwort: 1

[WebAPI] ASP.Net Ausgabe-Caching in ASP.NET Web-API

[Link kopieren]
Veröffentlicht am 17.01.2019 16:40:51 | | |
1. Nuget installiert die entsprechende DLL

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

Zwei. Erstelle ein neues ActionFilterAttribut und überschreibe die zugehörigen Methoden

    öffentliche Klasse WebApiOutputCacheAttribute : ActionFilterAttribute
    {
        Cache-Zeit/Sekunde
        Private Int _timespan;
        Client Cache time/sec
        Private Int _clientTimeSpan;
        Ob es von anonymen Nutzern zwischengespeichert wird
        Private Bool _anonymousOnly;
        Cache den Indexschlüssel
        Privatsaiten-_cachekey;
        Cache-Lagerhäuser
        privater statischer Readonly-ObjectCache WebApiCache = MemoryCache.Default;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = Zeitspanne;
          _clientTimeSpan = clientTimeSpan;
          _anonymousOnly = anonymNur;
        }

//是否缓存
        private bool _isCacheable(HttpActionContext ac)
        {
             if (_timespan > 0 & _clientTimeSpan > 0)
             {
                wenn (_anonymousOnly)
                   if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
                         return false;
               wenn (ac. Request.Method == HttpMethod.Get) return true;
            }
           oder
           {
                neue InvalidOperationException ("Falsche Argumente") werfen);
           }
            return false;
        }

        private CacheControlHeaderValue setClientCache()
        {
            var cachecontrol = neuer CacheControlHeaderValue();
            Cachecontrol. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan);
            Cachecontrol. MustRevalidate = wahr;
            Cachecontrol zurückzugeben;
        }


//Action调用前执行的方法
        public override void OnActionExecuting(HttpActionContext ac)
        {
            wenn (ac != null)
            {
                wenn (_isCacheable(ac))
                {
                    _cachekey = Schnur. Join(":", neue Saite[] { ac. Request.RequestUri.AbsolutePath, AC. Request.Headers.Accept.FirstOrDefault(). ToString() });
                    if (WebApiCache.Contains(_cachekey))
                    {
                        var val = (string)WebApiCache.Get(_cachekey);
                        wenn (val != null)
                        {
                            AC. Antwort = AC. Request.CreateResponse();
                            AC. Response.Content = neuer StringContent(val);
                            var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct");
                            wenn (contenttype == null)
                                contenttype = neuer MediaTypeHeaderValue(_cachekey. Split(':')[1]);
                            AC. Response.Content.Headers.ContentType = contenttype;
                            AC. Response.Headers.CacheControl = setClientCache();
                            Rückgabe;
                        }
                    }
                }
            }
            oder
            {
                neue ArgumentNullException ("actionContext") werfen;
            }
        }


//Action调用后执行方法
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            wenn (!( WebApiCache.Contains(_cachekey)))
            {
                var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Ergebnis;
                WebApiCache.Add(_cachekey, body, DateTime.Now.AddSeconds(_timespan));
                WebApiCache.Add(_cachekey + ":response-ct", actionExecutedContext.Response.Content.Headers.ContentType, DateTime.Now.AddSeconds(_timespan));
            }
            wenn (_isCacheable(actionExecutedContext.ActionContext))
                actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache();
        }

    }

3. Der Controller muss den Cache zur Get-Methode hinzufügen, um den Filter hinzuzufügen

     [WebApiOutputCache(120,60,false)]
        öffentliche Zeichenkette GetShoppingCart()
        {
            "Hello World" zurückkehren;
        }
Beginne, beobachte den Breakpoint und beobachte den Effekt. Der gesamte Prozess besteht darin: Initialisieren Sie den Cache-Filter beim Start und rufen Sie dann die Get-Methode mit hinzugefügtem Filter auf, geben Sie die OnActionExecuting-Methode ein, bestimmen, ob es einen relevanten Cache gibt, falls ja, geben Sie das Ergebnis direkt zurück, wenn nicht, rufen Sie die Aktion des Controllers auf und rufen dann die OnActionExekutiv-Methode auf, um das entsprechende Cache-Schlüssel-Wert-Paar hinzuzufügen und die Cache-Verfallszeit so einzustellen, dass sie das Ergebnis zurückgibt.




Vorhergehend:Deinstalliere das win10-redundante Anwendungstool
Nächster:"CSS World" von Zhang Xinxu azw3+mobi+epub
Veröffentlicht am 19.01.2019 09:09:45 |
Gut
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com