﻿
{"id":10836,"date":"2019-04-28T22:34:49","date_gmt":"2019-04-28T22:34:49","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=10836"},"modified":"2019-04-28T22:34:49","modified_gmt":"2019-04-28T22:34:49","slug":"asp-net-core-2-2-response-caching","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2-2-response-caching\/","title":{"rendered":"Asp.NET Core 2.2 &#8211; Response Caching"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba<\/p>\n<p>Bu i\u00e7eri\u011fimizde, hem istemci hemde sunucu taraf\u0131nda \u00f6nbelle\u011fe alma sorumlulu\u011funu g\u00fcden Response Caching middleware&#8217;ini inceleyece\u011fiz. <\/p>\n<p>Response Caching ile \u00f6nbelle\u011fe al\u0131nm\u0131\u015f olan endpointler yap\u0131lan ilk request neticesinden sonraki t\u00fcm requestlerde belirtilen s\u00fcre \u00e7er\u00e7evesinde \u00f6nbellekten cevapland\u0131r\u0131lacakt\u0131r. Dolay\u0131s\u0131yla ilgili endpointler yersiz istekler ile l\u00fczumsuz yere me\u015fgul edilmeyecek b\u00f6ylece uygulama sunucusu gereken i\u015flemlere daha \u00e7ok odaklanabilecek ve total maliyet minimize edilmi\u015f olacakt\u0131r.<\/p>\n<p>Response Caching middleware&#8217;ini uygulamada kullanabilmek i\u00e7in ilk olarak ilgili projeye &#8220;Startup.cs&#8221; dosyas\u0131ndaki &#8220;ConfigureServices&#8221; metodu i\u00e7erisinde &#8220;AddResponseCaching&#8221; fonksiyonuyla a\u015fa\u011f\u0131daki gibi servis olarak dahil edilmesi gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddResponseCaching();\r\n        }\r\n<\/pre>\n<p>Response Caching tan\u0131mlamas\u0131n\u0131 yaparken a\u015fa\u011f\u0131daki \u00fc\u00e7 parametreyle ayarlar\u0131na m\u00fcdahalede bulunabiliriz.<\/p>\n<ul>\n<li><strong>MaximumBodySize<\/strong> : Response Body&#8217;ler i\u00e7in ge\u00e7erli maksimum boyut. Varsay\u0131lan olarak 64 MB&#8217;t\u0131r.<\/li>\n<li><strong>SizeLimit<\/strong> : Response Cache&#8217;in maksimum ne kadar boyutta tutulaca\u011f\u0131n\u0131 belirtiriz. Varsay\u0131lan olarak 100 MB de\u011ferine sahiptir. <\/li>\n<li><strong>UseCaseSensitivePaths<\/strong> : Path de\u011ferinin b\u00fcy\u00fck ya da k\u00fc\u00e7\u00fck harf duyarl\u0131\u011f\u0131nda olup olmamas\u0131n\u0131 belirler.<\/li>\n<\/ul>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddResponseCaching(_ =&gt;\r\n            {\r\n                _.MaximumBodySize = 250;\r\n                _.SizeLimit = 250;\r\n                _.UseCaseSensitivePaths = false;\r\n            });\r\n        }\r\n<\/pre>\n<p>Ve ard\u0131ndan yine ayn\u0131 dosya i\u00e7erisindeki &#8220;Configure&#8221; metodu i\u00e7erisinde de uygulamada kullan\u0131labilir olarak &#8220;UseResponseCaching&#8221; fonksiyonu ile a\u015fa\u011f\u0131daki gibi ayarlanmal\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.UseResponseCaching();\r\n        }\r\n<\/pre>\n<p>Gerekli konfig\u00fcrasyonlar\u0131 yapt\u0131ktan sonra cachelenmesini istedi\u011fimiz endpoint&#8217;te &#8220;ResponseCache&#8221; attributeu arac\u0131l\u0131\u011f\u0131yla a\u015fa\u011f\u0131daki \u00f6zellikleri kullanarak \u00f6nbellekleme i\u015flemi ger\u00e7ekle\u015ftirilebilir.<\/p>\n<ul>\n<li><strong>Duration<\/strong> : Response&#8217;un saniye cinsinden ne kadar s\u00fcre cache&#8217;de tutulaca\u011f\u0131n\u0131 belirtti\u011fimiz \u00f6zelliktir.<\/li>\n<li><strong>Location<\/strong> : Cache&#8217;leme i\u015fleminin nerede yap\u0131laca\u011f\u0131n\u0131 belirtti\u011fimiz \u00f6zelliktir.\n<ul>\n<li><strong style=\"color:orange;\">Any<\/strong> (Default) <\/li>\n<li><strong style=\"color:orange;\">Client<\/strong> : <\/li>\n<li><strong style=\"color:orange;\">None<\/strong> : <\/li>\n<\/ul>\n<\/li>\n<li><strong>NoStore<\/strong> : Cache verisinin store edilip edilmeyece\u011fi bilgisinin tutuldu\u011fu \u00f6zelliktir. Bir ba\u015fka deyi\u015fle sayfan\u0131n header bilgilerinde &#8220;no cache&#8221; bilgisinin g\u00f6nderilip g\u00f6nderilmeyece\u011fini belirler.<\/li>\n<li><strong>CacheProfileName<\/strong> : Cache profil ismini belirtti\u011fimiz \u00f6zelliktir. Makalenin ileriki sat\u0131rlar\u0131nda bu \u00f6zelli\u011fe at\u0131fta bulunaca\u011f\u0131z.<\/li>\n<li><strong>VaryByHeader<\/strong> : Response header da yer alan Vary Key bilgisine g\u00f6re \u00f6nbellekleme i\u015flemlerinin yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>VaryByQueryKeys<\/strong> : Query String&#8217;te gelen parametreye g\u00f6re hangi response&#8217;un cachelenece\u011fi belirtilmektedir.<\/li>\n<\/ul>\n<p>\u015eimdi a\u015fa\u011f\u0131daki \u00f6rnek kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        &#x5B;ResponseCache(Duration = 130)]\r\n        public IActionResult Index()\r\n        {\r\n            ViewBag.Now = DateTime.Now;\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, ResponseCache attribute&#8217;u ile &#8220;Index&#8221; metodunda ki Response datay\u0131 130 saniyelik bir s\u00fcreyle cachelemi\u015f bulunmaktay\u0131z. Uygulama \u00e7al\u0131\u015f\u0131rken &#8220;Index&#8221; metoduna yap\u0131lan ilk requestte d\u00f6nd\u00fcr\u00fclen Response data CacheMiddleware&#8217;i taraf\u0131ndan 130 saniye boyunca Response Cache&#8217;de tutulacak. Bu 130 saniye boyunca hi\u00e7bir request &#8220;Index&#8221; metodunu tetiklemeyecek ve response olarak direkt olarak middleware taraf\u0131ndan cache \u00fczerinden elde edilen data g\u00f6nderilecektir..<\/p>\n<h3>Cache Profiles<\/h3>\n<p>Her bir \u00f6nbellek ayarlamas\u0131 yukar\u0131daki gibi tek tek endpoint merkezli yap\u0131labilece\u011fi gibi &#8220;Startup.cs&#8221; dosyas\u0131ndan da a\u015fa\u011f\u0131daki gibi uygulama aya\u011fa kald\u0131r\u0131l\u0131rken direkt olarak ayarlanabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddResponseCaching();\r\n            services.AddMvc(_ =&gt;\r\n            {\r\n                _.CacheProfiles.Add(&quot;Default_Cache_1&quot;, new CacheProfile()\r\n                {\r\n                    Duration = 50\r\n                });\r\n                _.CacheProfiles.Add(&quot;Default_Cache_2&quot;, new CacheProfile()\r\n                {\r\n                    Duration = 65\r\n                });\r\n            });\r\n        }\r\n<\/pre>\n<p>Bu \u015fekilde ayarlanan Cache Profile tan\u0131mlamalar\u0131 endpointler \u00fczerinde a\u015fa\u011f\u0131daki gibi kullan\u0131labilirler.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        &#x5B;ResponseCache(CacheProfileName = &quot;Default_Cache_1&quot;)]\r\n        public IActionResult Index()\r\n        {\r\n            ViewBag.Now = DateTime.Now;\r\n            return View();\r\n        }\r\n\r\n        &#x5B;ResponseCache(CacheProfileName = &quot;Default_Cache_2&quot;)]\r\n        public IActionResult Index2()\r\n        {\r\n            ViewBag.Now = DateTime.Now;\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/04\/Asp.NET-Core-2.2-Response-Caching.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/04\/Asp.NET-Core-2.2-Response-Caching.png\" alt=\"Asp.NET Core 2.2 - Response Caching\" width=\"474\" height=\"71\" class=\"aligncenter size-full wp-image-10857\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/04\/Asp.NET-Core-2.2-Response-Caching.png 474w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/04\/Asp.NET-Core-2.2-Response-Caching-300x45.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131m\u0131zda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba Bu i\u00e7eri\u011fimizde, hem istemci hemde sunucu taraf\u0131nda \u00f6nbelle\u011fe alma sorumlulu\u011funu g\u00fcden Response Caching middleware&#8217;ini inceleyece\u011fiz. Response Caching ile \u00f6nbelle\u011fe al\u0131nm\u0131\u015f olan endpointler yap\u0131lan ilk request neticesinden sonraki t\u00fcm requestlerde belirtilen s\u00fcre \u00e7er\u00e7evesinde \u00f6nbellekten&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":9596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2832],"tags":[2833,2835,2834,2839,2837,2838,2836,2840],"class_list":["post-10836","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2-2","tag-addresponsecaching","tag-asp-net-core-2-2","tag-asp-net-core-2-2-response-caching","tag-asp-net-core-cache-profiles","tag-asp-net-core-response-caching","tag-cache-profiles","tag-response-caching","tag-response-caching-cache-profiles"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=10836"}],"version-history":[{"count":21,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10836\/revisions"}],"predecessor-version":[{"id":10858,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10836\/revisions\/10858"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/9596"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=10836"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=10836"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=10836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}