Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 14395|Odpowiedź: 1

[WebAPI] ASP.Net Bufor wyjściowy w ASP.NET Web API

[Skopiuj link]
Opublikowano 17.01.2019 16:40:51 | | |
1. Nuget instaluje odpowiednie dll

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

Dwa. Stwórz nowy atrybut ActionFilterAttribute i nadpisz powiązane metody

    public class WebApiOutputCacheAttribute : ActionFilterAttribute
    {
        Czas pamięci podręcznej na sekundę
        prywatny _timespan;
        Czas pamięci podręcznej klienta
        prywatny _clientTimeSpan;
        Czy jest przechowywana przez anonimowych użytkowników
        prywatny Bool _anonymousOnly;
        Zapisz klucz indeksowy
        prywatna struna _cachekey;
        Magazyny pamięci podręcznej
        prywatny, statyczny tylko do odczytu ObjectCache WebApiCache = MemoryCache.Default;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = przedział czasu;
          _clientTimeSpan = klientCzasCzasRozpęty;
          _anonymousOnly = anonimowyTylko;
        }

//是否缓存
        private bool _isCacheable(HttpActionContext ac)
        {
             jeśli (_timespan > 0 & _clientTimeSpan > 0)
             {
                jeśli (_anonymousOnly)
                   if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
                         return false;
               jeśli (ac. Request.Method == HttpMethod.Get) zwróć true;
            }
           else
           {
                throw new InvalidOperationException ("Wrong Argument");
           }
            return false;
        }

        private CacheControlHeaderValue setClientCache()
        {
            var cachecontrol = nowy CacheControlHeaderValue();
            Kontrola pamięci podręcznej. MaxAge = CzasOkres.OdSekund(_clientTimeSpan);
            Kontrola pamięci podręcznej. MusiRevalidować = prawdziwe;
            return cachecontrol;
        }


//Action调用前执行的方法
        public override unieważnia OnActionExecuting(HttpActionContext ac)
        {
            jeśli (ac != null)
            {
                if (_isCacheable(ac))
                {
                    _cachekey = struna. Join(":", nowy ciąg[] { ac. Request.RequestUri.AbsolutePath, ac. Request.Headers.Accept.FirstOrDefault(). ToString() });
                    if (WebApiCache.Contains(_cachekey))
                    {
                        var val = (string)WebApiCache.Get(_cachekey);
                        if (val != null)
                        {
                            AC. Odpowiedź = ac. Request.CreateResponse();
                            AC. Response.Content = nowy StringContent(val);
                            var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct");
                            if (contenttype == null)
                                contenttype = nowy MediaTypeHeaderValue(_cachekey. Split(':')[1]);
                            AC. Response.Content.Headers.ContentType = contenttype;
                            AC. Response.Headers.CacheControl = setClientCache();
                            powrót;
                        }
                    }
                }
            }
            else
            {
                throw new ArgumentNullException("actionContext");
            }
        }


//Action调用后执行方法
        public override unieważnia OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (!( WebApiCache.Contains(_cachekey)))
            {
                var body = actionExecutedContext.Response.Content.ReadAsStringAsync(). Wynik;
                WebApiCache.Add(_cachekey, ciało, 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. Kontroler musi dodać pamięć podręczną do metody Get, aby dodać filtr

     [WebApiOutputCache(120,60,false)]
        public string GetShoppingCart()
        {
            powrócił "Hello World";
        }
Zaczynaj, obserwuj punkt przełomowy i obserwuj efekt. Cały proces to: inicjalizacja filtra pamięci podręcznej przy starcie, następnie wywołanie metody Get z dodanym filtrem, wejście metody OnActionExecuting, określenie, czy istnieje odpowiednia pamięć podręczna, jeśli jest, bezpośrednie zwrócenie wyniku, jeśli nie, wywołanie Akcji kontrolera, a następnie wywołanie metody OnActionEkuene, aby dodać odpowiednią parę klucz-wartość pamięci podręcznej i ustawić czas wygaśnięcia pamięci podręcznej, aby zwrócić wynik.




Poprzedni:Odinstaluj redundantne narzędzie aplikacji win10
Następny:"CSS World" autorstwa Zhang Xinxu azw3+mobi+epub
Opublikowano 19.01.2019 09:09:45 |
Dobrze
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com