Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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
    {
        Время кэша в секунду
        Частный Int _timespan;
        Время/секунда кэша клиента
        рядовой международный _clientTimeSpan;
        Кэшируется ли она анонимными пользователями
        рядовой бул-_anonymousOnly;
        Кэшировать индексный ключ
        частный струнный _cachekey;
        Склады для кэша
        приватный статический для чтения ObjectCache WebApiCache = MemoryCache.Default;


        public WebApiOutputCacheAttribute(int timespan, int clientTimeSpan, bool anonymousOnly)
        {
          _timespan = временной промежуток;
          _clientTimeSpan = clientTimeSpan;
          _anonymousOnly = anonymousOnly;
        }

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

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


//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 = (string)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, body, 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 9:09:45 |
Хорошо
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com