{"id":36555,"date":"2025-12-19T21:00:40","date_gmt":"2025-12-19T18:00:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/"},"modified":"2025-12-19T21:00:40","modified_gmt":"2025-12-19T18:00:40","slug":"c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/","title":{"rendered":"C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n"},"content":{"rendered":"<h2>C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n<\/h2>\n<p>C# Minimal API&#8217;lar, .NET ekosisteminde h\u0131zl\u0131 ve hafif web servisleri olu\u015fturmak i\u00e7in pop\u00fcler bir tercih haline geldi. Bu modern yakla\u015f\u0131m, geli\u015ftiricilere daha az kodla daha fazla i\u015f yapma imkan\u0131 sunarken, performans\u0131 optimize etmek her zaman \u00f6ncelikli bir konudur. \u0130\u015fte bu noktada, .NET 7 ve sonraki s\u00fcr\u00fcmlerle birlikte gelen g\u00fc\u00e7l\u00fc &#8220;Output Caching&#8221; (\u00c7\u0131kt\u0131 \u00d6nbellekleme) \u00f6zelli\u011fi devreye giriyor ve Minimal API&#8217;lar\u0131n\u0131z\u0131n yan\u0131t s\u00fcrelerini dramatik bir \u015fekilde iyile\u015ftirmenize olanak tan\u0131yor.<\/p>\n<h3>\u00c7\u0131kt\u0131 \u00d6nbellekleme Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Web uygulamalar\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve sunucu kaynaklar\u0131n\u0131 daha verimli kullanmak i\u00e7in \u00e7e\u015fitli stratejiler mevcuttur. Bu stratejilerin ba\u015f\u0131nda \u00f6nbellekleme (caching) gelir. \u00c7\u0131kt\u0131 \u00f6nbellekleme, \u00f6zellikle s\u0131k\u00e7a istenen ve i\u00e7eri\u011fi de\u011fi\u015fmeyen veya nadiren de\u011fi\u015fen API yan\u0131tlar\u0131n\u0131 sunucu taraf\u0131nda ge\u00e7ici olarak saklayarak, her istekte ayn\u0131 veriyi yeniden \u00fcretme maliyetini ortadan kald\u0131ran g\u00fc\u00e7l\u00fc bir tekniktir.<\/p>\n<h4>\u00d6nbelleklemenin Temelleri<\/h4>\n<p>\u00d6nbellekleme, bir verinin veya bir i\u015flemin sonucunun daha sonraki istekler i\u00e7in h\u0131zl\u0131ca eri\u015filebilir bir yerde saklanmas\u0131 prensibine dayan\u0131r. Bu sayede, ayn\u0131 istek tekrar geldi\u011finde, veri taban\u0131na gitmek, karma\u015f\u0131k hesaplamalar yapmak veya harici bir servisten veri \u00e7ekmek gibi zaman al\u0131c\u0131 i\u015flemlerden ka\u00e7\u0131n\u0131l\u0131r. Bunun yerine, \u00f6nbellekteki haz\u0131r yan\u0131t do\u011frudan istemciye sunulur.<\/p>\n<h4>Sunucu Y\u00fck\u00fcn\u00fc Azaltma<\/h4>\n<p>\u00c7\u0131kt\u0131 \u00f6nbellekleme, \u00f6zellikle y\u00fcksek trafikli API&#8217;larda sunucu y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Her istek i\u00e7in veri taban\u0131 sorgusu \u00e7al\u0131\u015ft\u0131rmak, CPU yo\u011fun i\u015flemler yapmak veya a\u011f \u00fczerinden harici servislerle ileti\u015fim kurmak yerine, \u00f6nbellekteki bir yan\u0131t\u0131n d\u00f6nd\u00fcr\u00fclmesi \u00e7ok daha az kaynak t\u00fcketir. Bu, sunucunuzun daha fazla e\u015fzamanl\u0131 iste\u011fi daha az donan\u0131m maliyetiyle i\u015flemesini sa\u011flar.<\/p>\n<h4>Yan\u0131t S\u00fcrelerini K\u0131saltma<\/h4>\n<p>Kullan\u0131c\u0131lar h\u0131zl\u0131 yan\u0131t veren uygulamalar\u0131 severler. \u00c7\u0131kt\u0131 \u00f6nbellekleme, API yan\u0131t s\u00fcrelerini milisaniyeler seviyesine \u00e7ekerek kullan\u0131c\u0131 deneyimini do\u011frudan iyile\u015ftirir. Verinin \u00f6nbellekten al\u0131nmas\u0131, t\u00fcm i\u015fleme pipeline&#8217;\u0131n\u0131n ba\u015ftan sona \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131ndan \u00e7ok daha h\u0131zl\u0131d\u0131r. Bu, \u00f6zellikle mobil uygulamalar veya tek sayfa uygulamalar (SPA) gibi h\u0131zl\u0131 etkile\u015fim gerektiren platformlar i\u00e7in kritik bir avantajd\u0131r.<\/p>\n<h3>C# Minimal API ve \u00d6nbellekleme \u0130htiyac\u0131<\/h3>\n<p>Minimal API&#8217;lar, .NET 6 ile tan\u0131t\u0131lan ve .NET 7\/8 ile olgunla\u015fan, ASP.NET Core&#8217;un hafif ve mod\u00fcler bir yakla\u015f\u0131m\u0131d\u0131r. Daha az boilerplate kod ile RESTful API&#8217;lar olu\u015fturmay\u0131 hedefler. Ancak bu sadelik, performans optimizasyonlar\u0131ndan \u00f6d\u00fcn verildi\u011fi anlam\u0131na gelmez; aksine, Minimal API&#8217;lar da do\u011fru stratejilerle son derece performansl\u0131 olabilir.<\/p>\n<h4>Minimal API&#8217;lar\u0131n Avantajlar\u0131<\/h4>\n<p>Minimal API&#8217;lar, geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131ran, kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azaltan ve \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcren bir\u00e7ok avantaja sahiptir. K\u00fc\u00e7\u00fck ve odaklanm\u0131\u015f servisler olu\u015fturmak i\u00e7in idealdirler. Ancak, herhangi bir web servisi gibi, yo\u011fun kullan\u0131ld\u0131klar\u0131nda performans darbo\u011fazlar\u0131yla kar\u015f\u0131la\u015fabilirler.<\/p>\n<h4>Performans Darbo\u011fazlar\u0131 ve \u00c7\u00f6z\u00fcmler<\/h4>\n<p>Minimal API&#8217;lar h\u0131zl\u0131 olsalar da, her istekte veri taban\u0131 eri\u015fimi, karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 y\u00fcr\u00fctme veya d\u0131\u015f servislere yap\u0131lan \u00e7a\u011fr\u0131lar gibi i\u015flemler, yan\u0131t s\u00fcrelerini uzatabilir ve sunucu kaynaklar\u0131n\u0131 t\u00fcketebilir. Bu darbo\u011fazlar\u0131 a\u015fman\u0131n en etkili yollar\u0131ndan biri, s\u0131k\u00e7a istenen yan\u0131tlar\u0131 \u00f6nbelle\u011fe almakt\u0131r. \u00c7\u0131kt\u0131 \u00f6nbellekleme, bu t\u00fcr senaryolarda devreye girerek performans\u0131 g\u00f6zle g\u00f6r\u00fcl\u00fcr \u015fekilde art\u0131r\u0131r.<\/p>\n<h4>Geleneksel API&#8217;lara G\u00f6re Farklar<\/h4>\n<p>Geleneksel ASP.NET Core MVC veya Web API projelerinde \u00f6nbellekleme i\u00e7in farkl\u0131 yakla\u015f\u0131mlar (\u00f6rne\u011fin, Action Filter&#8217;lar veya \u00f6zel middleware&#8217;ler) kullan\u0131labiliyordu. Minimal API&#8217;lar, daha basit bir yap\u0131ya sahip oldu\u011fundan, .NET 7\/8 ile sunulan yerle\u015fik Output Caching middleware&#8217;i, bu API&#8217;lara \u00f6zel olarak tasarlanm\u0131\u015f, entegrasyonu kolay ve g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>.NET 7\/8 ile Gelen Output Caching Mimarisi<\/h3>\n<p>.NET 7 ile birlikte ASP.NET Core&#8217;a entegre edilen Output Caching middleware&#8217;i, web uygulamalar\u0131nda \u00e7\u0131kt\u0131 \u00f6nbelleklemeyi standart ve kolay bir hale getirdi. Bu yeni mimari, Minimal API&#8217;lar ile m\u00fckemmel bir uyum sa\u011flayarak geli\u015ftiricilere esneklik ve kontrol sunar.<\/p>\n<h4>Yeni \u00d6nbellekleme Katman\u0131<\/h4>\n<p>Output Caching, HTTP yan\u0131tlar\u0131n\u0131 bellek i\u00e7i veya da\u011f\u0131t\u0131k bir \u00f6nbellekte saklamak i\u00e7in tasarlanm\u0131\u015f yeni bir middleware katman\u0131d\u0131r. Bu katman, gelen istekleri yakalar, \u00f6nbellekte bir yan\u0131t olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve varsa do\u011frudan bu yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcr. Yoksa, iste\u011fi i\u015fleme pipeline&#8217;\u0131na devam ettirir ve olu\u015fan yan\u0131t\u0131 \u00f6nbelle\u011fe alarak bir sonraki ayn\u0131 istek i\u00e7in haz\u0131r hale getirir.<\/p>\n<h4>Middleware Entegrasyonu<\/h4>\n<p>Output Caching, ASP.NET Core&#8217;un standart middleware pipeline&#8217;\u0131na entegre edilir. Bu, uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 dosyas\u0131nda (genellikle <code>Program.cs<\/code>) birka\u00e7 sat\u0131r kodla kolayca etkinle\u015ftirilebilece\u011fi anlam\u0131na gelir. Middleware&#8217;in konumu \u00f6nemlidir; genellikle kimlik do\u011frulama ve yetkilendirme gibi g\u00fcvenlik katmanlar\u0131ndan sonra, ancak endpoint&#8217;lerin y\u00fcr\u00fct\u00fclmesinden \u00f6nce yerle\u015ftirilir.<\/p>\n<h4>Temel Yap\u0131land\u0131rma Ad\u0131mlar\u0131<\/h4>\n<p>Output Caching&#8217;i kullanmak i\u00e7in \u00f6ncelikle servislerinizi kaydetmeniz ve ard\u0131ndan middleware&#8217;i uygulaman\u0131z gerekir. Bu ad\u0131mlar olduk\u00e7a basittir ve genellikle a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ 1. Output Caching servislerini kaydet\nbuilder.Services.AddOutputCache();\n\nvar app = builder.Build();\n\n\/\/ 2. Output Caching middleware'ini kullan\napp.UseOutputCache();\n\n\/\/ Di\u011fer middleware'ler ve endpoint'ler...\n<\/pre>\n<p><\/code><\/p>\n<p>Bu temel ad\u0131mlarla, uygulaman\u0131z art\u0131k \u00e7\u0131kt\u0131 \u00f6nbellekleme yetene\u011fine sahip olacakt\u0131r.<\/p>\n<h3>Minimal API'da Output Caching Nas\u0131l Uygulan\u0131r?<\/h3>\n<p>Output Caching'i Minimal API endpoint'lerinize uygulamak son derece basittir. Genellikle <code>.CacheOutput()<\/code> uzant\u0131 metodu kullan\u0131larak yap\u0131l\u0131r.<\/p>\n<h4>Servislerin Kaydedilmesi<\/h4>\n<p>Daha \u00f6nce de belirtildi\u011fi gibi, Output Caching'i kullanmaya ba\u015flamadan \u00f6nce <code>AddOutputCache()<\/code> metodunu \u00e7a\u011f\u0131rarak gerekli servisleri ba\u011f\u0131ml\u0131l\u0131k enjeksiyon konteynerine kaydetmelisiniz. Bu, \u00f6nbellekleme mekanizmas\u0131n\u0131n d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131 i\u00e7in temel bir ad\u0131md\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nbuilder.Services.AddOutputCache();\n<\/pre>\n<p><\/code><\/p>\n<h4>Endpoint'lere \u00d6nbellekleme Uygulama<\/h4>\n<p>Servisler kaydedildikten ve middleware pipeline'a eklendikten sonra, belirli bir Minimal API endpoint'ine \u00f6nbellekleme uygulamak i\u00e7in <code>.CacheOutput()<\/code> metodunu kullanabilirsiniz. Bu metot, endpoint'in yan\u0131t\u0131n\u0131n belirli bir s\u00fcre \u00f6nbellekte tutulmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\napp.MapGet(\"\/cacheddata\", () => Results.Ok(\"Bu veri \u00f6nbellekten geliyor!\"))\n   .CacheOutput(p => p.Expire(TimeSpan.FromSeconds(30))); \/\/ 30 saniye \u00f6nbellekte kalacak\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>\/cacheddata<\/code> endpoint'ine yap\u0131lan isteklerin yan\u0131t\u0131 30 saniye boyunca \u00f6nbellekte tutulacakt\u0131r. Bu s\u00fcre zarf\u0131nda gelen t\u00fcm istekler, \u00f6nbellekteki veriyi alacak ve endpoint'in i\u015f mant\u0131\u011f\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131lmayacakt\u0131r.<\/p>\n<h4>Basit Bir Kod \u00d6rne\u011fi<\/h4>\n<p>Daha kapsaml\u0131 bir \u00f6rnekle, bir \u00fcr\u00fcn listesi d\u00f6nd\u00fcren bir API'yi \u00f6nbelle\u011fe alal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddOutputCache(); \/\/ Output Caching servislerini ekle\nvar app = builder.Build();\napp.UseOutputCache(); \/\/ Output Caching middleware'ini kullan\n\n\/\/ Basit bir \u00fcr\u00fcn s\u0131n\u0131f\u0131\nrecord Product(int Id, string Name, decimal Price);\n\n\/\/ \u00dcr\u00fcn listesini d\u00f6nd\u00fcren ve 60 saniye \u00f6nbelle\u011fe al\u0131nan Minimal API endpoint'i\napp.MapGet(\"\/products\", async () => {\n    \/\/ Bu k\u0131s\u0131m sadece \u00f6nbellek bo\u015fken veya s\u00fcresi doldu\u011funda \u00e7al\u0131\u015f\u0131r\n    await Task.Delay(100); \/\/ Veri taban\u0131 sorgusu veya harici servis \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n    var products = new List<Product>\n    {\n        new Product(1, \"Laptop\", 1200m),\n        new Product(2, \"Mouse\", 25m),\n        new Product(3, \"Keyboard\", 75m)\n    };\n    Console.WriteLine(\"\u00dcr\u00fcn listesi olu\u015fturuldu ve \u00f6nbelle\u011fe al\u0131nd\u0131.\");\n    return Results.Ok(products);\n})\n.CacheOutput(p => p.Expire(TimeSpan.FromSeconds(60))) \/\/ 60 saniye \u00f6nbellekte tut\n.WithName(\"GetProducts\"); \/\/ Endpoint'e isim ver (iste\u011fe ba\u011fl\u0131)\n\napp.Run();\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>\/products<\/code> endpoint'ine ilk istek geldi\u011finde, \u00fcr\u00fcn listesi olu\u015fturulacak ve \"\u00dcr\u00fcn listesi olu\u015fturuldu ve \u00f6nbelle\u011fe al\u0131nd\u0131.\" mesaj\u0131 konsola yaz\u0131lacakt\u0131r. Sonraki 60 saniye i\u00e7inde gelen t\u00fcm istekler ise do\u011frudan \u00f6nbellekten servis edilecek ve konsola herhangi bir mesaj yaz\u0131lmayacakt\u0131r, \u00e7\u00fcnk\u00fc endpoint'in i\u015f mant\u0131\u011f\u0131 tekrar \u00e7al\u0131\u015fmayacakt\u0131r.<\/p>\n<h3>\u00d6nbellekleme Politikalar\u0131 ve \u00d6zelle\u015ftirmeler<\/h3>\n<p>Output Caching, sadece basit s\u00fcre tabanl\u0131 \u00f6nbelleklemenin \u00f6tesinde, \u00e7e\u015fitli politikalar ve \u00f6zelle\u015ftirmelerle daha esnek senaryolar\u0131 destekler. Bu sayede, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re \u00f6nbellekleme davran\u0131\u015f\u0131n\u0131 ince ayarlayabilirsiniz.<\/p>\n<h4>Cache S\u00fcresi ve Varyasyonlar<\/h4>\n<p>\u00d6nbellekleme s\u00fcresi, <code>Expire()<\/code> metodu ile belirlenir. Ancak, bazen ayn\u0131 endpoint'in farkl\u0131 parametrelerle \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda farkl\u0131 \u00f6nbellek girdileri olu\u015fturmas\u0131n\u0131 isteyebiliriz. Bu durumlarda <code>VaryByQuery()<\/code>, <code>VaryByHeader()<\/code> veya <code>VaryByRouteValue()<\/code> gibi metotlar kullan\u0131l\u0131r.<\/p>\n<ul>\n<li><code>Expire(TimeSpan)<\/code>: \u00d6nbellekte kalma s\u00fcresi.<\/li>\n<li><code>VaryByQuery(string[])<\/code>: Belirtilen sorgu parametrelerine g\u00f6re farkl\u0131 \u00f6nbellek girdileri olu\u015fturur.<\/li>\n<li><code>VaryByHeader(string[])<\/code>: Belirtilen HTTP ba\u015fl\u0131klar\u0131na g\u00f6re farkl\u0131 \u00f6nbellek girdileri olu\u015fturur.<\/li>\n<li><code>VaryByRouteValue(string[])<\/code>: Rota de\u011ferlerine g\u00f6re farkl\u0131 \u00f6nbellek girdileri olu\u015fturur.<\/li>\n<\/ul>\n<pre><code class=\"language-csharp\">\n\/\/ Farkl\u0131 kategori ID'lerine g\u00f6re \u00f6nbellekleme\napp.MapGet(\"\/products\/{categoryId}\", (int categoryId) => Results.Ok($\"Kategori {categoryId} \u00fcr\u00fcnleri\"))\n   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)).VaryByRouteValue(\"categoryId\"));\n\n\/\/ Farkl\u0131 \"Accept-Language\" ba\u015fl\u0131\u011f\u0131na g\u00f6re \u00f6nbellekleme\napp.MapGet(\"\/localizeddata\", () => Results.Ok(\"Dil bazl\u0131 veri\"))\n   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(1)).VaryByHeader(\"Accept-Language\"));\n<\/pre>\n<p><\/code><\/p>\n<h4>HTTP Ba\u015fl\u0131klar\u0131na G\u00f6re \u00d6nbellekleme<\/h4>\n<p><code>VaryByHeader()<\/code> metodu, istemcinin g\u00f6nderdi\u011fi belirli HTTP ba\u015fl\u0131klar\u0131n\u0131n de\u011ferlerine g\u00f6re farkl\u0131 \u00f6nbellek girdileri olu\u015fturman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, farkl\u0131 dillerdeki i\u00e7erikleri sunan bir API'n\u0131z varsa, <code>Accept-Language<\/code> ba\u015fl\u0131\u011f\u0131na g\u00f6re \u00f6nbellekleme yapabilirsiniz.<\/p>\n<h4>Kimlik Do\u011frulamal\u0131 \u0130stekler \u0130\u00e7in \u00d6nbellekleme<\/h4>\n<p>Varsay\u0131lan olarak, Output Caching kimlik do\u011frulamas\u0131 gerektiren (<code>[Authorize]<\/code> ile i\u015faretlenmi\u015f) endpoint'leri \u00f6nbelle\u011fe almaz. Ancak, <code>CacheOutput()<\/code> metoduna <code>p.Cache()<\/code> ile bir politika tan\u0131mlayarak bu davran\u0131\u015f\u0131 de\u011fi\u015ftirebilirsiniz. Dikkatli kullan\u0131lmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc ki\u015fiye \u00f6zel verilerin yanl\u0131\u015fl\u0131kla \u00f6nbelle\u011fe al\u0131nmas\u0131 g\u00fcvenlik a\u00e7\u0131\u011f\u0131 olu\u015fturabilir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Kimlik do\u011frulamal\u0131 endpoint'i \u00f6nbelle\u011fe alma (dikkatli kullan\u0131n!)\napp.MapGet(\"\/securedata\", [Authorize] () => Results.Ok(\"G\u00fcvenli veri\"))\n   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(1)).Cache()); \/\/ Cache() metodu ile \u00f6nbelle\u011fe al\u0131nabilir hale getirir.\n<\/pre>\n<p><\/code><\/p>\n<h4>Politika Tan\u0131mlama \u00d6rnekleri<\/h4>\n<p>Daha karma\u015f\u0131k \u00f6nbellekleme politikalar\u0131n\u0131 merkezi olarak tan\u0131mlayabilir ve daha sonra endpoint'lerde bu politikalar\u0131 kullanabilirsiniz. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve y\u00f6netimi kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nbuilder.Services.AddOutputCache(options =>\n{\n    options.AddPolicy(\"MyCustomPolicy\", builder => builder.Expire(TimeSpan.FromMinutes(10)).Tag(\"my-tag\"));\n    options.AddPolicy(\"NoCachePolicy\", builder => builder.NoCache()); \/\/ Hi\u00e7 \u00f6nbelle\u011fe alma\n});\n\n\/\/ ...\n\napp.MapGet(\"\/datawithpolicy\", () => Results.Ok(\"\u00d6zel politika ile \u00f6nbelle\u011fe al\u0131nd\u0131\"))\n   .CacheOutput(\"MyCustomPolicy\"); \/\/ Tan\u0131mlanm\u0131\u015f politikay\u0131 kullan\n\napp.MapGet(\"\/nocachedata\", () => Results.Ok(\"Bu veri asla \u00f6nbelle\u011fe al\u0131nmaz\"))\n   .CacheOutput(\"NoCachePolicy\");\n<\/pre>\n<p><\/code><\/p>\n<h3>Geli\u015fmi\u015f Senaryolar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Output Caching, \u00e7o\u011fu senaryo i\u00e7in harika bir \u00e7\u00f6z\u00fcm olsa da, baz\u0131 geli\u015fmi\u015f durumlar ve dikkat edilmesi gereken noktalar vard\u0131r.<\/p>\n<h4>\u00d6nbellek Ge\u00e7ersiz K\u0131lma (Invalidation)<\/h4>\n<p>\u00d6nbellekteki verinin s\u00fcresi dolmadan \u00f6nce g\u00fcncellenmesi gerekti\u011finde, \u00f6nbelle\u011fi manuel olarak ge\u00e7ersiz k\u0131lmak (invalidation) \u00f6nemlidir. Output Caching, etiketleme (tagging) mekanizmas\u0131 ile bu i\u015flemi kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Endpoint'e etiket ekle\napp.MapGet(\"\/taggeddata\", () => Results.Ok(\"Etiketli veri\"))\n   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)).Tag(\"important-data\"));\n\n\/\/ Bir ba\u015fka endpoint'ten \u00f6nbelle\u011fi ge\u00e7ersiz k\u0131lma\napp.MapPost(\"\/invalidate-data\", (IOutputCacheStore cache) => {\n    cache.EvictByTagAsync(\"important-data\", CancellationToken.None);\n    return Results.Ok(\"\u00d6nbellek ge\u00e7ersiz k\u0131l\u0131nd\u0131.\");\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>\/taggeddata<\/code> endpoint'i <code>important-data<\/code> etiketiyle \u00f6nbelle\u011fe al\u0131n\u0131r. <code>\/invalidate-data<\/code> endpoint'ine yap\u0131lan bir istek, bu etikete sahip t\u00fcm \u00f6nbellek girdilerini ge\u00e7ersiz k\u0131lar.<\/p>\n<h4>Da\u011f\u0131t\u0131k \u00d6nbellekleme (Distributed Caching)<\/h4>\n<p>Varsay\u0131lan olarak, Output Caching bellek i\u00e7i (in-memory) bir \u00f6nbellek kullan\u0131r. Ancak, birden fazla sunucu \u00f6rne\u011fi (instance) \u00e7al\u0131\u015ft\u0131ran da\u011f\u0131t\u0131k bir ortamda, her sunucunun kendi \u00f6nbelle\u011fi olaca\u011f\u0131 i\u00e7in tutarl\u0131l\u0131k sorunlar\u0131 ya\u015fanabilir. Bu t\u00fcr senaryolarda, Redis veya SQL Server gibi da\u011f\u0131t\u0131k bir \u00f6nbellek sa\u011flay\u0131c\u0131s\u0131 kullanmak gerekir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Program.cs\nbuilder.Services.AddStackExchangeRedisCache(options =>\n{\n    options.Configuration = \"localhost:6379\"; \/\/ Redis ba\u011flant\u0131 dizesi\n    options.InstanceName = \"MyAppCache\";\n});\nbuilder.Services.AddOutputCache(options =>\n{\n    options.AddDistributedCache(); \/\/ Da\u011f\u0131t\u0131k \u00f6nbelle\u011fi kullan\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma ile Output Caching, bellek i\u00e7i yerine Redis'i \u00f6nbellek depolama alan\u0131 olarak kullanacakt\u0131r, bu da da\u011f\u0131t\u0131k ortamlarda \u00f6nbellek tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<\/p>\n<h4>G\u00fcvenlik ve Veri Tutarl\u0131l\u0131\u011f\u0131<\/h4>\n<p>\u00d6nbellekleme kullan\u0131rken g\u00fcvenlik ve veri tutarl\u0131l\u0131\u011f\u0131 konular\u0131na dikkat etmek \u00e7ok \u00f6nemlidir. Hassas veya ki\u015fiye \u00f6zel verileri yanl\u0131\u015fl\u0131kla \u00f6nbelle\u011fe almamaya \u00f6zen g\u00f6sterin. Kimlik do\u011frulamal\u0131 API'lar i\u00e7in \u00f6nbellekleme yaparken <code>VaryByHeader(\"Authorization\")<\/code> veya <code>VaryByClaim()<\/code> gibi se\u00e7enekleri de\u011ferlendirin veya sadece genel, herkese a\u00e7\u0131k verileri \u00f6nbelle\u011fe al\u0131n.<\/p>\n<p>Ayr\u0131ca, \u00f6nbellekteki verinin ne kadar s\u00fcreyle g\u00fcncel kalmas\u0131 gerekti\u011fi konusunda dikkatli olun. \u00c7ok uzun \u00f6nbellekleme s\u00fcreleri, kullan\u0131c\u0131lar\u0131n bayat (stale) veri g\u00f6rmesine neden olabilirken, \u00e7ok k\u0131sa s\u00fcreler \u00f6nbelleklemenin faydalar\u0131n\u0131 azaltabilir.<\/p>\n<h3>Performans ve \u00d6l\u00e7eklenebilirlik \u00dczerine Etkileri<\/h3>\n<p>Output Caching'in uygulaman\u0131z\u0131n performans\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi \u00fczerindeki etkileri genellikle \u00e7ok olumludur. Do\u011fru uyguland\u0131\u011f\u0131nda, sunucu kaynaklar\u0131n\u0131n daha verimli kullan\u0131lmas\u0131n\u0131 ve daha h\u0131zl\u0131 yan\u0131t s\u00fcrelerini sa\u011flar.<\/p>\n<h4>Ger\u00e7ek D\u00fcnya Senaryolar\u0131<\/h4>\n<p>Bir e-ticaret sitesinin \u00fcr\u00fcn listesi, bir haber sitesinin ana sayfas\u0131 veya bir blogun makale listesi gibi s\u0131k\u00e7a eri\u015filen ve nadiren de\u011fi\u015fen i\u00e7erikler, \u00e7\u0131kt\u0131 \u00f6nbellekleme i\u00e7in ideal adaylard\u0131r. Bu t\u00fcr senaryolarda, \u00f6nbellekleme sayesinde binlerce e\u015fzamanl\u0131 iste\u011fe bile h\u0131zl\u0131ca yan\u0131t verilebilir.<\/p>\n<h4>Kaynak T\u00fcketimi Azaltma<\/h4>\n<p>\u00d6nbellekleme, her iste\u011fin t\u00fcm uygulama katmanlar\u0131ndan (veri taban\u0131, i\u015f mant\u0131\u011f\u0131, API katman\u0131) ge\u00e7mesini engelledi\u011fi i\u00e7in CPU, bellek ve I\/O (giri\u015f\/\u00e7\u0131k\u0131\u015f) kaynaklar\u0131n\u0131n t\u00fcketimini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bu, daha az sunucu kayna\u011f\u0131yla daha fazla i\u015f y\u00fck\u00fcn\u00fc kald\u0131rabilece\u011finiz anlam\u0131na gelir.<\/p>\n<h4>Kullan\u0131c\u0131 Deneyimi \u0130yile\u015ftirme<\/h4>\n<p>Daha h\u0131zl\u0131 yan\u0131t s\u00fcreleri, do\u011frudan daha iyi bir kullan\u0131c\u0131 deneyimi anlam\u0131na gelir. Uygulaman\u0131z\u0131n daha duyarl\u0131 hissetmesini sa\u011flar, kullan\u0131c\u0131lar\u0131n bekleme s\u00fcrelerini azalt\u0131r ve genel memnuniyeti art\u0131r\u0131r. \u00d6zellikle mobil cihazlarda veya yava\u015f internet ba\u011flant\u0131lar\u0131nda bu fark daha da belirginle\u015fir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>C# Minimal API'lar, h\u0131zl\u0131 ve hafif web servisleri geli\u015ftirmek i\u00e7in modern ve etkili bir yoldur. .NET 7\/8 ile gelen Output Caching \u00f6zelli\u011fi ise, bu API'lar\u0131n performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini bir \u00fcst seviyeye ta\u015f\u0131yan kritik bir ara\u00e7t\u0131r. Do\u011fru uyguland\u0131\u011f\u0131nda, Output Caching, sunucu y\u00fck\u00fcn\u00fc azalt\u0131r, yan\u0131t s\u00fcrelerini k\u0131salt\u0131r ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<p>Geli\u015ftiriciler olarak, Minimal API projelerimizde performans\u0131 art\u0131rmak i\u00e7in Output Caching'i aktif olarak de\u011ferlendirmeli ve uygulamam\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re \u00f6zelle\u015ftirilmi\u015f \u00f6nbellekleme politikalar\u0131 olu\u015fturmal\u0131y\u0131z. Bu sayede, hem daha verimli hem de daha h\u0131zl\u0131 \u00e7al\u0131\u015fan uygulamalar geli\u015ftirebiliriz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<dl>\n<dt>Output Caching her senaryo i\u00e7in uygun mu?<\/dt>\n<dd>Hay\u0131r, Output Caching \u00f6zellikle i\u00e7eri\u011fi s\u0131k\u00e7a de\u011fi\u015fmeyen veya herkese a\u00e7\u0131k olan API yan\u0131tlar\u0131 i\u00e7in uygundur. Ki\u015fiye \u00f6zel, s\u0131k\u00e7a g\u00fcncellenen veya \u00e7ok dinamik i\u00e7erikler i\u00e7in daha farkl\u0131 \u00f6nbellekleme stratejileri (\u00f6rne\u011fin, In-Memory Cache veya Distributed Cache kullanarak veriyi uygulama i\u00e7inde \u00f6nbelle\u011fe alma) daha uygun olabilir.<\/dd>\n<dt>Da\u011f\u0131t\u0131k \u00f6nbellekleme nas\u0131l yap\u0131l\u0131r?<\/dt>\n<dd>Da\u011f\u0131t\u0131k \u00f6nbellekleme i\u00e7in <code>AddStackExchangeRedisCache()<\/code> gibi bir da\u011f\u0131t\u0131k \u00f6nbellek sa\u011flay\u0131c\u0131s\u0131n\u0131 servislerinize eklemeniz ve ard\u0131ndan <code>AddOutputCache()<\/code> metoduna <code>options.AddDistributedCache()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapman\u0131z gerekir. Bu sayede Output Caching, bellek i\u00e7i yerine yap\u0131land\u0131r\u0131lan da\u011f\u0131t\u0131k \u00f6nbelle\u011fi kullan\u0131r.<\/dd>\n<dt>\u00d6nbellek ne zaman temizlenir?<\/dt>\n<dd>\u00d6nbellek, belirledi\u011finiz s\u00fcre (<code>Expire()<\/code> metodu) doldu\u011funda otomatik olarak temizlenir. Ayr\u0131ca, <code>IOutputCacheStore<\/code> servisini enjekte ederek ve <code>EvictByTagAsync()<\/code> metodunu kullanarak belirli etiketlere sahip \u00f6nbellek girdilerini manuel olarak ge\u00e7ersiz k\u0131labilirsiniz.<\/dd>\n<dt>Kimlik do\u011frulamal\u0131 API'lar i\u00e7in kullan\u0131labilir mi?<\/dt>\n<dd>Evet, ancak dikkatli kullan\u0131lmal\u0131d\u0131r. Varsay\u0131lan olarak Output Caching, kimlik do\u011frulamas\u0131 gerektiren endpoint'leri \u00f6nbelle\u011fe almaz. Ancak, <code>.CacheOutput(p => p.Cache())<\/code> ile bu davran\u0131\u015f\u0131 de\u011fi\u015ftirebilirsiniz. Bu durumda, <code>VaryByHeader(\"Authorization\")<\/code> gibi varyasyonlar\u0131 kullanarak her kullan\u0131c\u0131 i\u00e7in ayr\u0131 bir \u00f6nbellek giri\u015fi olu\u015fturman\u0131z veya sadece genel, g\u00fcvenli verileri \u00f6nbelle\u011fe ald\u0131\u011f\u0131n\u0131zdan emin olman\u0131z \u00f6nemlidir.<\/dd>\n<dt>Output Caching ve Response Caching aras\u0131ndaki fark nedir?<\/dt>\n<dd>Output Caching, .NET 7 ile tan\u0131t\u0131lan daha yeni ve g\u00fc\u00e7l\u00fc bir middleware'dir. Hem sunucu taraf\u0131nda (in-memory veya distributed) \u00f6nbellekleme yapar hem de istemci taraf\u0131 \u00f6nbellekleme ba\u015fl\u0131klar\u0131n\u0131 (Cache-Control) y\u00f6netir. Response Caching ise daha \u00e7ok istemci taraf\u0131 \u00f6nbellekleme ba\u015fl\u0131klar\u0131n\u0131 y\u00f6netmeye odaklanm\u0131\u015f eski bir middleware'dir ve sunucu taraf\u0131nda kal\u0131c\u0131 bir \u00f6nbellek sa\u011flamaz.<\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"Web uygulamalar\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve sunucu kaynaklar\u0131n\u0131 daha verimli kullanmak i\u00e7in \u00e7e\u015fitli stratej&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[228],"tags":[],"class_list":{"0":"post-36555","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# Minimal API&#039;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Minimal API&#039;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n\" \/>\n<meta property=\"og:description\" content=\"Web uygulamalar\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve sunucu kaynaklar\u0131n\u0131 daha verimli kullanmak i\u00e7in \u00e7e\u015fitli stratej...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-19T18:00:40+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n\",\"datePublished\":\"2025-12-19T18:00:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\"},\"wordCount\":2345,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C#\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\",\"name\":\"C# Minimal API'da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-19T18:00:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C# Minimal API'da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/","og_locale":"tr_TR","og_type":"article","og_title":"C# Minimal API'da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n","og_description":"Web uygulamalar\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve sunucu kaynaklar\u0131n\u0131 daha verimli kullanmak i\u00e7in \u00e7e\u015fitli stratej...","og_url":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-19T18:00:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n","datePublished":"2025-12-19T18:00:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/"},"wordCount":2345,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C#"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/","url":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/","name":"C# Minimal API'da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-19T18:00:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/c-minimal-apida-cikti-onbellekleme-output-caching-performansi-zirveye-tasiyin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C# Minimal API&#8217;da \u00c7\u0131kt\u0131 \u00d6nbellekleme (Output Caching): Performans\u0131 Zirveye Ta\u015f\u0131y\u0131n"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36555"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36555\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}