Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 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
    {
        Кеш време/секунда
        Частен международен _timespan;
        Време/секунда на кеша на клиента
        Частен международен _clientTimeSpan;
        Дали е кеширан от анонимни потребители
        редник bool _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();
            Cachecontrol. MaxAge = ВремеОбхват.FromSeconds(_clientTimeSpan);
            Cachecontrol. MustRevalidate = вярно;
            return cachecontrol;
        }


//Action调用前执行的方法
        public override void OnActionExecuting(HttpActionContext ac)
        {
            ако (ac != null)
            {
                ако (_isCacheable(ac))
                {
                    _cachekey = струна. Join(":", нова струна[] { ac. Request.RequestUri.AbsolutePath, 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 = new MediaTypeHeaderValue(_cachekey. Split(':')[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 г. 9:09:45 ч. |
Добре
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com