Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 14395|Відповідь: 1

[WebAPI] ASP.Net Кешування вихідних даних у ASP.NET Web API

[Копіювати посилання]
Опубліковано 17.01.2019 16:40:51 | | |
1. Nuget встановлює відповідний dll

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

Два. Створіть новий атрибут ActionFilterAttribute і перезапишіть відповідні методи

    публічний клас WebApiOutputCacheAttribute : ActionFilterAttribute
    {
        Час кешу/сек
        Private int _timespan;
        Час кешу клієнта на секунду
        Private int _clientTimeSpan;
        Чи кешується вона анонімними користувачами
        рядовий бул-_anonymousOnly;
        Кешуйте індексний ключ
        приватний струнний _cachekey;
        Склади кешу
        приватний статичний лише для читання: ObjectCache WebApiCache = MemoryCache.Default;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = часовий проміжок;
          _clientTimeSpan = clientTimeSpan;
          _anonymousOnly = anonymousOnly;
        }

//是否缓存
        приватний bool _isCacheable(HttpActionContext ac)
        {
             якщо (_timespan > 0 і _clientTimeSpan > 0)
             {
                якщо (_anonymousOnly)
                   якщо (Thread.CurrentPrincipal.Identity.IsAuthenticated)
                         повернення хибно;
               якщо (AC. Request.Method == HttpMethod.Get) поверне true;
            }
           інше
           {
                викинути new InvalidOperationException("Неправильні аргументи");
           }
            повернення хибно;
        }

        приватний CacheControlHeaderValue setClientCache()
        {
            var cachecontrol = новий CacheControlHeaderValue();
            Контроль кешу. MaxAge = TimeSpan.FromSeconds(_clientTimeSpan);
            Контроль кешу. MustRevalidate = true;
            return cachecontrol;
        }


//Action调用前执行的方法
        public override void OnActionExecuting(HttpActionContext ac)
        {
            якщо (ac != null)
            {
                якщо (_isCacheable(ac))
                {
                    _cachekey = струна. Join(":", new string[] { ac. Запит. Запит Uri. Абсолютний шлях, ac. Request.Headers.Accept.FirstOrDefault(). ToString() });
                    якщо (WebApiCache.Contains(_cachekey))
                    {
                        var val = (рядок)WebApiCache.Get(_cachekey);
                        якщо (val != null)
                        {
                            AC. Відповідь = ac. Request.CreateResponse();
                            AC. Response.Content = новий StringContent(val);
                            var contenttype = (MediaTypeHeaderValue)WebApiCache.Get(_cachekey + ":response-ct");
                            якщо (contenttype == null)
                                contenttype = новий MediaTypeHeaderValue(_cachekey. Спліт(':')[1]);
                            AC. Response.Content.Headers.ContentType = contenttype;
                            AC. 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));
            }
            якщо (_isCacheable(actionExecutedContext.ActionContext))
                actionExecutedContext.ActionContext.Response.Headers.CacheControl = setClientCache();
        }

    }

3. Контролер має додати кеш до методу Get, щоб додати фільтр

     [WebApiOutputCache(120,60,false)]
        публічний рядок GetShoppingCart()
        {
            повернення «Hello World»;
        }
Почати, спостерігати за точкою розриву і спостерігати за ефектом. Весь процес такий: ініціалізувати кеш-фільтр при запуску, потім викликати метод Get з доданим фільтром, ввести метод OnActionExecuting, визначити, чи існує відповідний кеш, якщо він є, повернути результат напряму, якщо ні — викликати Action контролера, а потім викликати метод OnActionExecuted для додавання відповідної пари ключ-значення кешу і встановити час закінчення кешу для повернення результату.




Попередній:Видалити резервний інструмент застосунків win10
Наступний:"CSS World" від Zhang Xinxu azw3+mobi+epub
Опубліковано 19.01.2019 09:09:45 |
Хороший
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com