{"id":33911,"date":"2025-11-08T19:31:01","date_gmt":"2025-11-08T16:31:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/"},"modified":"2025-11-08T19:31:01","modified_gmt":"2025-11-08T16:31:01","slug":"asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/","title":{"rendered":"ASP.NET Core&#8217;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim"},"content":{"rendered":"<p><body><\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.<\/p>\n<p>Modern web uygulamalar\u0131, statik HTML sayfalar\u0131n\u0131n \u00f6tesine ge\u00e7erek kullan\u0131c\u0131lara dinamik ve interaktif deneyimler sunmay\u0131 hedefler. Bir borsa takip uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn; hisse senedi fiyatlar\u0131 anl\u0131k olarak g\u00fcncellenmeli, bir spor m\u00fcsabakas\u0131n\u0131n canl\u0131 skorlar\u0131 her saniyede de\u011fi\u015fmeli veya bir e-ticaret sitesinde sipari\u015f durumu an\u0131nda bildirilmelidir. Bu t\u00fcr senaryolar, sunucunun inisiyatifiyle istemciye veri g\u00f6nderebildi\u011fi &#8220;ger\u00e7ek zamanl\u0131&#8221; ileti\u015fimi gerektirir. Geleneksel HTTP istek-cevap d\u00f6ng\u00fcs\u00fc, istemcinin s\u00fcrekli olarak sunucuya &#8220;yeni bir \u015feyler var m\u0131?&#8221; diye sormas\u0131 (polling) esas\u0131na dayan\u0131r ki bu da hem gecikmelere yol a\u00e7ar hem de sunucu kaynaklar\u0131n\u0131 verimsiz kullan\u0131r. Bu noktada, sunucunun aktif olarak istemciye veri &#8220;itti\u011fi&#8221; (push) mekanizmalar devreye girer.<\/p>\n<p>Ger\u00e7ek zamanl\u0131 ileti\u015fim i\u00e7in farkl\u0131 teknolojiler mevcuttur. \u00d6rne\u011fin, <strong>Polling<\/strong>, istemcinin belirli aral\u0131klarla sunucuya istek g\u00f6ndermesiyle \u00e7al\u0131\u015f\u0131r. Bu y\u00f6ntem basit olsa da, y\u00fcksek frekansl\u0131 g\u00fcncellemeler i\u00e7in a\u011f trafi\u011fini art\u0131r\u0131r ve gecikmelere neden olabilir. <strong>Long Polling<\/strong> ise, istemcinin yapt\u0131\u011f\u0131 bir iste\u011fin sunucu taraf\u0131ndan bir olay ger\u00e7ekle\u015fene veya belirli bir zaman a\u015f\u0131m\u0131 s\u00fcresine ula\u015fana kadar a\u00e7\u0131k tutulmas\u0131 prensibine dayan\u0131r. Bu, Polling&#8217;e g\u00f6re daha az gecikme sunar ancak yine de her olay i\u00e7in yeni bir HTTP ba\u011flant\u0131s\u0131 kurulmas\u0131n\u0131 gerektirir. <strong>WebSockets<\/strong> ise, istemci ve sunucu aras\u0131nda tam \u00e7ift y\u00f6nl\u00fc, kal\u0131c\u0131 bir ba\u011flant\u0131 olu\u015fturarak iki taraf\u0131n da diledi\u011fi zaman veri g\u00f6ndermesine olanak tan\u0131r. Y\u00fcksek performansl\u0131 ve d\u00fc\u015f\u00fck gecikmeli \u00e7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in idealdir. Ancak, tam \u00e7ift y\u00f6nl\u00fcl\u00fc\u011fe ihtiyac\u0131n\u0131z yoksa, yani sadece sunucudan istemciye tek y\u00f6nl\u00fc bir ak\u0131\u015f yeterliyse, WebSockets biraz a\u015f\u0131r\u0131ya ka\u00e7abilir.<\/p>\n<p>\u0130\u015fte tam bu noktada <strong>Server-Sent Events (SSE)<\/strong> devreye girer. SSE, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, sunucudan istemciye tek y\u00f6nl\u00fc bir olay ak\u0131\u015f\u0131 sa\u011flayan basit ama g\u00fc\u00e7l\u00fc bir teknolojidir. HTTP \u00fczerine kuruludur ve geleneksel bir HTTP ba\u011flant\u0131s\u0131 kullan\u0131r, ancak bu ba\u011flant\u0131 bir kez kurulduktan sonra sunucu taraf\u0131ndan s\u00fcrekli a\u00e7\u0131k tutularak istemciye &#8220;olaylar&#8221; g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle bildirimler, canl\u0131 veri ak\u0131\u015flar\u0131, ilerleme \u00e7ubuklar\u0131 veya s\u00fcrekli g\u00fcncellenen g\u00f6sterge panelleri gibi senaryolar i\u00e7in m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr. Ayr\u0131ca, WebSockets&#8217;tan farkl\u0131 olarak, SSE&#8217;nin kullan\u0131m\u0131 daha basittir \u00e7\u00fcnk\u00fc taray\u0131c\u0131 taraf\u0131nda <code>EventSource<\/code> API&#8217;si ile kolayca entegre edilebilir ve taray\u0131c\u0131lar taraf\u0131ndan otomatik yeniden ba\u011flanma deste\u011fi sunar. WebForms ortam\u0131ndan gelip ASP.NET Core&#8217;a ge\u00e7en geli\u015ftiriciler i\u00e7in, olay tabanl\u0131 bu yakla\u015f\u0131m, belirli olaylara tepki verme al\u0131\u015fkanl\u0131\u011f\u0131na olduk\u00e7a yak\u0131nd\u0131r ve ge\u00e7i\u015f s\u00fcrecini kolayla\u015ft\u0131rabilir. ASP.NET Core&#8217;un esnek mimarisi sayesinde, SSE endpoint&#8217;leri olu\u015fturmak olduk\u00e7a kolayd\u0131r ve bu sayede uygulaman\u0131z ger\u00e7ek zamanl\u0131 yeteneklere h\u0131zl\u0131ca kavu\u015fabilir.<\/p>\n<h2>ASP.NET Core&#8217;da Server-Sent Events (SSE) Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Server-Sent Events (SSE), web uygulamalar\u0131nda sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131lan basit ve etkili bir teknolojidir. Temel olarak, standart bir HTTP ba\u011flant\u0131s\u0131 \u00fczerinden s\u00fcrekli bir veri ak\u0131\u015f\u0131 olu\u015fturur. Bu ak\u0131\u015f, istemci taraf\u0131ndan ba\u015flat\u0131lan tek bir HTTP iste\u011fi ile kurulur, ancak bu istek geleneksel isteklerin aksine bir kez cevapland\u0131ktan sonra kapanmaz; sunucu taraf\u0131ndan a\u00e7\u0131k tutularak zaman i\u00e7inde birden fazla veri paketi g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r. Bu sayede, sunucu herhangi bir zamanda istemciye veri &#8220;push&#8221; edebilir, yani iletebilir.<\/p>\n<p>SSE&#8217;nin temel \u00e7al\u0131\u015fma prensibi olduk\u00e7a basittir. \u0130stemci (genellikle bir web taray\u0131c\u0131s\u0131), JavaScript&#8217;in <code>EventSource<\/code> API&#8217;sini kullanarak sunucuya \u00f6zel bir HTTP iste\u011fi g\u00f6nderir. Bu istek, sunucuya bir SSE ak\u0131\u015f\u0131 ba\u015flatmak istedi\u011fini bildirir. Sunucu, bu iste\u011fi ald\u0131\u011f\u0131nda, cevab\u0131n Content-Type ba\u015fl\u0131\u011f\u0131n\u0131 <code>text\/event-stream<\/code> olarak ayarlar. Bu \u00f6zel Content-Type, taray\u0131c\u0131ya gelen verilerin bir SSE ak\u0131\u015f\u0131 oldu\u011funu ve bunlar\u0131 birer olay olarak i\u015flemesi gerekti\u011fini s\u00f6yler. Ard\u0131ndan, sunucu veri g\u00f6ndermek istedi\u011finde, belirli bir formatta (<code>data: mesaj\u0131n\u0131z\\n\\n<\/code> gibi) veriyi HTTP yan\u0131t ak\u0131\u015f\u0131na yazar ve bu veriler istemciye an\u0131nda ula\u015f\u0131r.<\/p>\n<p>Bir SSE ak\u0131\u015f\u0131n\u0131n en \u00f6nemli \u00f6zelliklerinden biri, istemci taraf\u0131ndaki <code>EventSource<\/code> objesinin otomatik yeniden ba\u011flanma (reconnection) yetene\u011fidir. E\u011fer a\u011f ba\u011flant\u0131s\u0131 kesilir veya sunucu taraf\u0131nda bir hata olu\u015fursa, <code>EventSource<\/code> objesi belirli bir s\u00fcre sonra otomatik olarak ba\u011flant\u0131y\u0131 tekrar kurmaya \u00e7al\u0131\u015f\u0131r. Bu \u00f6zellik, ger\u00e7ek zamanl\u0131 uygulamalarda ba\u011flant\u0131 kesintilerine kar\u015f\u0131 dayan\u0131kl\u0131l\u0131k sa\u011flar ve geli\u015ftiricinin manuel olarak yeniden ba\u011flant\u0131 mant\u0131\u011f\u0131 yazma y\u00fck\u00fcn\u00fc azalt\u0131r. Ayr\u0131ca, sunucu, her olay\u0131n ba\u015f\u0131na bir <code>id:<\/code> alan\u0131 ekleyerek olaylar\u0131 numaraland\u0131rabilir. \u0130stemci yeniden ba\u011fland\u0131\u011f\u0131nda, en son ald\u0131\u011f\u0131 olay\u0131n ID&#8217;sini sunucuya iletebilir (<code>Last-Event-ID<\/code> ba\u015fl\u0131\u011f\u0131 ile), b\u00f6ylece sunucu kesintiden sonra eksik kalan olaylar\u0131 g\u00f6ndermeye devam edebilir. Bu da veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in \u00f6nemli bir \u00f6zelliktir.<\/p>\n<p>ASP.NET Core&#8217;da bir SSE endpoint&#8217;i olu\u015fturmak i\u00e7in genellikle bir controller metodu veya Minimal API endpoint&#8217;i kullan\u0131l\u0131r. Bu endpoint, iste\u011fi yakalar, <code>Response.ContentType<\/code>&#8216;\u0131 <code>text\/event-stream<\/code> olarak ayarlar ve ard\u0131ndan bir d\u00f6ng\u00fc i\u00e7inde <code>Response.Body.WriteAsync()<\/code> metodu ile verileri istemciye g\u00f6nderir. Her veri g\u00f6nderiminden sonra <code>Response.Body.FlushAsync()<\/code> \u00e7a\u011fr\u0131lmas\u0131 \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu, arabellekteki verilerin hemen istemciye iletilmesini sa\u011flar. Bu basitlik, ASP.NET Core&#8217;un middleware ve esnek HTTP i\u015fleme yetenekleri sayesinde kolayca uygulanabilir. Geli\u015ftiricilerin WebForms&#8217;ta oldu\u011fu gibi karma\u015f\u0131k olay d\u00f6ng\u00fcleri veya sayfa ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimi yerine, do\u011frudan HTTP ak\u0131\u015f\u0131 \u00fczerinde \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. SSE&#8217;nin bu yap\u0131s\u0131, tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyan bir\u00e7ok senaryo i\u00e7in d\u00fc\u015f\u00fck maliyetli ve y\u00fcksek verimli bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: SSE kullan\u0131rken, <code>Response.Body.FlushAsync()<\/code> metodunu her veri g\u00f6nderiminden sonra \u00e7a\u011f\u0131rmay\u0131 unutmay\u0131n. Aksi takdirde, veriler sunucu arabelle\u011finde kalabilir ve istemciye ula\u015fmada gecikmeler ya\u015fanabilir.\n    <\/div>\n<h2>Ad\u0131m Ad\u0131m ASP.NET Core Uygulamas\u0131nda SSE Entegrasyonu<\/h2>\n<p>ASP.NET Core uygulaman\u0131zda Server-Sent Events (SSE) kullanmak, hem backend hem de frontend taraf\u0131nda birka\u00e7 basit ad\u0131m\u0131 izlemeyi gerektirir. Bu b\u00f6l\u00fcmde, s\u0131f\u0131rdan bir ASP.NET Core projesi olu\u015fturarak, sunucuda bir SSE endpoint&#8217;i nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131 ve istemci taraf\u0131nda bu ak\u0131\u015f\u0131 nas\u0131l t\u00fcketece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bu rehber, .NET 7 veya .NET 8 kullanan modern bir ASP.NET Core projesi i\u00e7in ge\u00e7erlidir.<\/p>\n<h3>Backend Haz\u0131rl\u0131\u011f\u0131: Bir SSE Endpoint&#8217;i Olu\u015fturmak<\/h3>\n<p>\u00d6ncelikle, ASP.NET Core projemizi kurarak ba\u015flayal\u0131m. E\u011fer hen\u00fcz bir projeniz yoksa, komut sat\u0131r\u0131ndan a\u015fa\u011f\u0131daki komutla yeni bir Web API projesi olu\u015fturabilirsiniz:<\/p>\n<pre><code>\ndotnet new webapi -n SseDemoApp\ncd SseDemoApp\n    <\/pre>\n<p><\/code><\/p>\n<p>Projemizi olu\u015fturduktan sonra, SSE ak\u0131\u015f\u0131n\u0131 sa\u011flayacak bir controller veya Minimal API endpoint'i tan\u0131mlamam\u0131z gerekiyor. Minimal API'ler, daha az kodla daha h\u0131zl\u0131 endpoint'ler olu\u015fturmak i\u00e7in m\u00fckemmeldir. <code>Program.cs<\/code> dosyan\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki kod blo\u011funu ekleyin:<\/p>\n<pre><code>\n\/\/ Di\u011fer using ifadeleri...\nusing System.Threading.Channels;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ Add services to the container.\nbuilder.Services.AddControllers();\n\/\/ Learn more about configuring Swagger\/OpenAPI at https:\/\/aka.ms\/aspnetcore\/swashbuckle\nbuilder.Services.AddEndpointsApiExplorer();\nbuilder.Services.AddSwaggerGen();\n\nvar app = builder.Build();\n\n\/\/ Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.UseSwagger();\n    app.UseSwaggerUI();\n}\n\napp.UseHttpsRedirection();\napp.UseAuthorization();\napp.MapControllers();\n\n\/\/ SSE endpoint'imizi tan\u0131mlayal\u0131m\napp.MapGet(\"\/sse\", async context =>\n{\n    context.Response.ContentType = \"text\/event-stream\";\n    context.Response.Headers.Add(\"Cache-Control\", \"no-cache\");\n    context.Response.Headers.Add(\"Connection\", \"keep-alive\");\n\n    var lastEventId = context.Request.Headers[\"Last-Event-ID\"].FirstOrDefault();\n    Console.WriteLine($\"\u0130stemci ba\u011fland\u0131. Son Olay ID: {lastEventId}\");\n\n    for (int i = 0; i < 100; i++) \/\/ 100 mesaj g\u00f6nderece\u011fiz\n    {\n        if (context.RequestAborted.IsCancellationRequested)\n        {\n            Console.WriteLine(\"\u0130stemci ba\u011flant\u0131s\u0131 kesildi.\");\n            break;\n        }\n\n        var message = $\"data: Bu {i}. mesajd\u0131r. Sunucu saati: {DateTime.Now:HH:mm:ss}\\n\";\n        var id = $\"id: {i}\\n\"; \/\/ Otomatik yeniden ba\u011flanma i\u00e7in olay ID'si\n        \n        await context.Response.WriteAsync(id);\n        await context.Response.WriteAsync(message);\n        await context.Response.WriteAsync(\"\\n\"); \/\/ Her olay sonunda iki yeni sat\u0131r karakteri olmal\u0131\n\n        await context.Response.Body.FlushAsync(); \/\/ Veriyi an\u0131nda istemciye g\u00f6nder\n\n        await Task.Delay(TimeSpan.FromSeconds(2)); \/\/ Her 2 saniyede bir mesaj g\u00f6nder\n    }\n    Console.WriteLine(\"SSE ak\u0131\u015f\u0131 tamamland\u0131.\");\n});\n\napp.Run();\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda, <code>\/sse<\/code> adresine yap\u0131lan GET isteklerini kar\u015f\u0131layan bir Minimal API endpoint'i olu\u015fturduk. \u0130\u00e7erideki d\u00f6ng\u00fc, her iki saniyede bir istemciye yeni bir mesaj g\u00f6nderir. <code>context.Response.ContentType = \"text\/event-stream\"<\/code> sat\u0131r\u0131, taray\u0131c\u0131ya bu ak\u0131\u015f\u0131n bir SSE ak\u0131\u015f\u0131 oldu\u011funu bildirir. <code>Cache-Control<\/code> ve <code>Connection<\/code> ba\u015fl\u0131klar\u0131, ba\u011flant\u0131n\u0131n a\u00e7\u0131k kalmas\u0131n\u0131 ve \u00f6nbelle\u011fe al\u0131nmamas\u0131n\u0131 sa\u011flar. <code>id: {i}\\n<\/code> ve <code>data: ...\\n<\/code> format\u0131 SSE standartlar\u0131na uygun mesaj format\u0131d\u0131r ve her mesajdan sonra iki yeni sat\u0131r karakteri (<code>\\n\\n<\/code> veya tek bir <code>\\n<\/code> e\u011fer zaten <code>data:<\/code> sonunda varsa) olmas\u0131 gerekti\u011fini unutmay\u0131n. <code>FlushAsync()<\/code> \u00e7a\u011fr\u0131s\u0131, verilerin hemen istemciye ula\u015fmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, <code>context.RequestAborted.IsCancellationRequested<\/code> ile istemci ba\u011flant\u0131s\u0131n\u0131n kopup kopmad\u0131\u011f\u0131n\u0131 kontrol ederek gereksiz kaynak kullan\u0131m\u0131n\u0131 \u00f6nl\u00fcyoruz.<\/p>\n<h3>Frontend (\u0130stemci) Taraf\u0131nda SSE T\u00fcketimi<\/h3>\n<p>\u015eimdi de istemci taraf\u0131nda bu SSE ak\u0131\u015f\u0131n\u0131 nas\u0131l t\u00fcketece\u011fimizi g\u00f6relim. Basit bir HTML dosyas\u0131 ve JavaScript kullanarak sunucudan gelen mesajlar\u0131 dinleyece\u011fiz. Projenizin ana dizininde (veya <code>wwwroot<\/code> klas\u00f6r\u00fcnde) <code>index.html<\/code> ad\u0131nda bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-html\">\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SSE \u0130stemcisi<\/title>\n    <style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }\n        .container { max-width: 800px; margin: auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }\n        h1 { color: #0056b3; text-align: center; margin-bottom: 20px; }\n        #messages { border: 1px solid #ddd; padding: 15px; min-height: 150px; background-color: #e9e9e9; border-radius: 5px; overflow-y: auto; margin-bottom: 20px; }\n        .message-item { background-color: #f0f8ff; margin-bottom: 8px; padding: 10px; border-radius: 4px; border-left: 3px solid #007bff; }\n        .status { text-align: center; color: #555; font-style: italic; margin-top: 10px; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>Sunucu-\u0130stemci SSE \u0130leti\u015fimi<\/h1>\n        <div id=\"messages\">\n            <p class=\"status\">Sunucu ba\u011flant\u0131s\u0131 bekleniyor...<\/p>\n        <\/div>\n        <button id=\"closeButton\" style=\"display: block; margin: 15px auto; padding: 10px 20px; background-color: #dc3545; color: white; border: none; border-radius: 5px; cursor: pointer;\">Ba\u011flant\u0131y\u0131 Kes<\/button>\n    <\/div>\n\n    <script>\n        const messagesDiv = document.getElementById('messages');\n        const statusP = document.querySelector('.status');\n        const closeButton = document.getElementById('closeButton');\n        let eventSource;\n\n        function connectSSE() {\n            if (eventSource) {\n                eventSource.close(); \/\/ Mevcut ba\u011flant\u0131y\u0131 kapat\n            }\n            eventSource = new EventSource('https:\/\/localhost:7001\/sse'); \/\/ Kendi port numaran\u0131z\u0131 kullan\u0131n\n            statusP.textContent = 'Sunucuya ba\u011flan\u0131yor...';\n\n            eventSource.onopen = function(event) {\n                console.log(\"SSE ba\u011flant\u0131s\u0131 a\u00e7\u0131ld\u0131.\");\n                statusP.textContent = 'Ba\u011flant\u0131 a\u00e7\u0131k. Mesajlar bekleniyor...';\n            };\n\n            eventSource.onmessage = function(event) {\n                const p = document.createElement('p');\n                p.className = 'message-item';\n                p.textContent = <code>[ID: ${event.lastEventId}] ${event.data}<\/code>;\n                messagesDiv.appendChild(p);\n                messagesDiv.scrollTop = messagesDiv.scrollHeight; \/\/ En alta kayd\u0131r\n            };\n\n            eventSource.onerror = function(event) {\n                console.error(\"SSE Hatas\u0131:\", event);\n                statusP.textContent = 'Ba\u011flant\u0131 hatas\u0131 veya kesintisi. Yeniden ba\u011flan\u0131l\u0131yor...';\n                \/\/ EventSource otomatik olarak yeniden ba\u011flanmaya \u00e7al\u0131\u015f\u0131r\n            };\n        }\n\n        connectSSE(); \/\/ Sayfa y\u00fcklendi\u011finde ba\u011flant\u0131y\u0131 ba\u015flat\n\n        closeButton.addEventListener('click', () => {\n            if (eventSource) {\n                eventSource.close();\n                statusP.textContent = 'Ba\u011flant\u0131 manuel olarak kesildi.';\n                console.log(\"SSE ba\u011flant\u0131s\u0131 manuel olarak kapat\u0131ld\u0131.\");\n            }\n        });\n    <\/script>\n<\/body>\n<\/html>\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu HTML dosyas\u0131nda, <code>EventSource<\/code> API'sini kullanarak <code>\/sse<\/code> endpoint'ine ba\u011flan\u0131yoruz. <code>eventSource.onopen<\/code>, <code>eventSource.onmessage<\/code> ve <code>eventSource.onerror<\/code> olaylar\u0131 ile ba\u011flant\u0131 durumu ve gelen mesajlar\u0131 ele al\u0131yoruz. Gelen her mesaj <code>messagesDiv<\/code> alan\u0131na eklenir. <code>event.lastEventId<\/code> \u00f6zelli\u011fi, sunucudan gelen son olay\u0131n ID'sini i\u00e7erir ve otomatik yeniden ba\u011flanma senaryolar\u0131nda sunucunun hangi noktadan devam etmesi gerekti\u011fini belirtmek i\u00e7in kullan\u0131l\u0131r. Kodu \u00e7al\u0131\u015ft\u0131rabilmek i\u00e7in, <code>Program.cs<\/code> dosyas\u0131ndaki <code>app.UseStaticFiles();<\/code> sat\u0131r\u0131n\u0131n uncommented (yorum sat\u0131r\u0131 d\u0131\u015f\u0131na al\u0131nm\u0131\u015f) oldu\u011fundan ve <code>index.html<\/code> dosyan\u0131z\u0131n <code>wwwroot<\/code> klas\u00f6r\u00fcnde bulundu\u011fundan emin olun. Ayr\u0131ca, <code>https:\/\/localhost:7001<\/code> k\u0131sm\u0131n\u0131 kendi uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port numaras\u0131n\u0131 ayarlamay\u0131 unutmay\u0131n (genellikle konsol \u00e7\u0131kt\u0131s\u0131nda g\u00f6r\u00fcn\u00fcr).<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda SSE Kullan\u0131m\u0131: Vaka Analizleri<\/h2>\n<p>Server-Sent Events (SSE), tek y\u00f6nl\u00fc ger\u00e7ek zamanl\u0131 ileti\u015fim ihtiyac\u0131 olan bir\u00e7ok senaryoda etkili bir \u00e7\u00f6z\u00fcm sunar. Basitli\u011fi ve HTTP \u00fczerine in\u015fa edilmi\u015f olmas\u0131, onu belirli kullan\u0131m durumlar\u0131 i\u00e7in WebSockets'tan daha cazip hale getirebilir. \u0130\u015fte ger\u00e7ek d\u00fcnyadan birka\u00e7 \u00f6rnekle SSE'nin nas\u0131l kullan\u0131labilece\u011fi:<\/p>\n<h3>1. Uzun S\u00fcren \u0130\u015flemlerin Durum Takibi ve \u0130lerleme \u00c7ubuklar\u0131<\/h3>\n<p>Bir web uygulamas\u0131nda b\u00fcy\u00fck bir dosya y\u00fckleme, karma\u015f\u0131k bir veri i\u015fleme veya rapor olu\u015fturma gibi uzun s\u00fcrebilen i\u015flemlerle kar\u015f\u0131la\u015fmak yayg\u0131nd\u0131r. Kullan\u0131c\u0131n\u0131n bu i\u015flemin bitmesini beklerken sayfan\u0131n tak\u0131l\u0131 kalmas\u0131 veya durumunu bilememesi k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimi yarat\u0131r. SSE, bu t\u00fcr senaryolarda kullan\u0131c\u0131lara i\u015flemin mevcut durumu veya ilerlemesi hakk\u0131nda anl\u0131k g\u00fcncellemeler sunmak i\u00e7in idealdir. \u00d6rne\u011fin, bir dosya y\u00fcklenirken sunucu, y\u00fcklenen bayt miktar\u0131n\u0131 veya tamamlanma y\u00fczdesini belirli aral\u0131klarla SSE ak\u0131\u015f\u0131 \u00fczerinden istemciye g\u00f6nderebilir. \u0130stemci taraf\u0131ndaki JavaScript kodu, bu veriyi alarak bir ilerleme \u00e7ubu\u011funu g\u00fcncelleyebilir veya durum mesajlar\u0131n\u0131 g\u00f6sterebilir. Bu, kullan\u0131c\u0131n\u0131n bekleme s\u00fcresini daha bilgilendirici ve katlan\u0131labilir hale getirir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ ASP.NET Core Backend (\u00d6rnek)\napp.MapGet(\"\/progress-updates\", async context =>\n{\n    context.Response.ContentType = \"text\/event-stream\";\n    context.Response.Headers.Add(\"Cache-Control\", \"no-cache\");\n    context.Response.Headers.Add(\"Connection\", \"keep-alive\");\n\n    for (int i = 0; i <= 100; i += 10)\n    {\n        if (context.RequestAborted.IsCancellationRequested) break;\n\n        var message = $\"data: {{ \\\"percentage\\\": {i}, \\\"status\\\": \\\"\u0130\u015fleniyor...\\\" }}\\n\\n\";\n        await context.Response.WriteAsync(message);\n        await context.Response.Body.FlushAsync();\n        await Task.Delay(TimeSpan.FromSeconds(1));\n    }\n    await context.Response.WriteAsync(\"data: {\\\"percentage\\\": 100, \\\"status\\\": \\\"Tamamland\u0131!\\\"}\\n\\n\");\n    await context.Response.Body.FlushAsync();\n});\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-html\"><\/pre>\n<p><\/code><br \/>\n<!-- Frontend (\u00d6rnek) --><\/p>\n<div id=\"progressBar\" style=\"width: 0%; background-color: blue; height: 20px;\"><\/div>\n<p><span id=\"progressText\">0%<\/span><br \/>\n<script>\n    const progressSource = new EventSource('\/progress-updates');\n    progressSource.onmessage = function(event) {\n        const data = JSON.parse(event.data);\n        document.getElementById('progressBar').style.width = data.percentage + '%';\n        document.getElementById('progressText').textContent = data.percentage + '% - ' + data.status;\n        if (data.percentage === 100) {\n            progressSource.close();\n        }\n    };\n<\/script><br \/>\n    <\/code><\/p>\n<h3>2. Canl\u0131 Veri Ak\u0131\u015flar\u0131 ve G\u00f6sterge Panelleri (Dashboards)<\/h3>\n<p>Finansal uygulamalar, IoT cihazlar\u0131ndan gelen sens\u00f6r verileri, a\u011f izleme sistemleri veya sosyal medya ak\u0131\u015flar\u0131 gibi bir\u00e7ok alanda, verilerin anl\u0131k olarak g\u00fcncellenmesi ve kullan\u0131c\u0131lara sunulmas\u0131 gerekir. SSE, bu t\u00fcr canl\u0131 veri ak\u0131\u015flar\u0131n\u0131 olu\u015fturmak i\u00e7in olduk\u00e7a uygundur. \u00d6rne\u011fin, bir IoT platformunda, sens\u00f6rlerden gelen s\u0131cakl\u0131k veya nem verileri sunucuya ula\u015ft\u0131\u011f\u0131nda, bu veriler an\u0131nda ilgili g\u00f6sterge panellerine sahip istemcilere SSE \u00fczerinden g\u00f6nderilebilir. \u0130stemciler bu verileri alarak grafiklerini veya tablolar\u0131n\u0131 dinamik olarak g\u00fcncelleyebilirler. Bu sayede kullan\u0131c\u0131lar, s\u00fcrekli yenileme yapmalar\u0131na gerek kalmadan en g\u00fcncel bilgilere eri\u015febilirler.<\/p>\n<p>Mobil uyumluluk a\u00e7\u0131s\u0131ndan, bu t\u00fcr g\u00f6sterge panellerinin responsive bir tasar\u0131ma sahip olmas\u0131 \u00f6nemlidir. CSS media query'leri kullanarak farkl\u0131 ekran boyutlar\u0131na uygun d\u00fczenler olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-css\">\n\/* \u00d6rnek Mobil Uyumlu CSS *\/\n@media (max-width: 768px) {\n    .dashboard-widget {\n        width: 100%; \/* K\u00fc\u00e7\u00fck ekranlarda widget'lar tam geni\u015flikte olsun *\/\n        float: none;\n        margin-bottom: 15px;\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. Anl\u0131k Bildirimler ve Haber Ak\u0131\u015flar\u0131<\/h3>\n<p>Bir\u00e7ok uygulama, kullan\u0131c\u0131lara yeni e-postalar, sosyal medya bildirimleri, yeni haber makaleleri veya mesajlar hakk\u0131nda an\u0131nda bilgi vermek ister. SSE, bu t\u00fcr anl\u0131k bildirim sistemleri i\u00e7in basit ve g\u00fcvenilir bir \u00e7\u00f6z\u00fcmd\u00fcr. Sunucu, bir olay (\u00f6rne\u011fin, yeni bir mesaj gelmesi) ger\u00e7ekle\u015fti\u011finde, ilgili kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131lar\u0131na bir SSE mesaj\u0131 g\u00f6nderebilir. Taray\u0131c\u0131, bu mesaj\u0131 alarak bildirim \u00e7ubu\u011funu g\u00fcncelleyebilir, bir popup g\u00f6sterebilir veya bir ses \u00e7alabilir. Bu, kullan\u0131c\u0131lar\u0131n uygulamayla s\u00fcrekli etkile\u015fimde kalmas\u0131na yard\u0131mc\u0131 olur ve \u00f6nemli g\u00fcncellemeleri ka\u00e7\u0131rmalar\u0131n\u0131 engeller.<\/p>\n<p>\u00d6zetle, SSE, sunucudan istemciye tek y\u00f6nl\u00fc, olay tabanl\u0131 ileti\u015fimde basitlik, verimlilik ve otomatik yeniden ba\u011flanma yetene\u011fi arayan projeler i\u00e7in m\u00fckemmel bir se\u00e7imdir. Yukar\u0131daki vaka analizleri, bu teknolojinin geni\u015f bir kullan\u0131m yelpazesine sahip oldu\u011funu g\u00f6stermektedir ve ASP.NET Core ile entegrasyonu olduk\u00e7a kolayd\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey SSE Teknikleri ve Performans \u0130pu\u00e7lar\u0131<\/h2>\n<p>Server-Sent Events (SSE), basit bir teknoloji olsa da, daha karma\u015f\u0131k senaryolarda ve y\u00fcksek performans gerektiren uygulamalarda baz\u0131 ileri d\u00fczey teknikler ve optimizasyon ipu\u00e7lar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r. Bu b\u00f6l\u00fcmde, SSE uygulamalar\u0131n\u0131z\u0131 daha sa\u011flam, \u00f6l\u00e7eklenebilir ve verimli hale getirecek y\u00f6ntemleri ke\u015ffedece\u011fiz.<\/p>\n<h3>1. Mesaj Format\u0131n\u0131 Zenginle\u015ftirmek: JSON Kullan\u0131m\u0131<\/h3>\n<p>SSE standard\u0131, <code>data:<\/code> anahtar kelimesinden sonra herhangi bir metin verisinin g\u00f6nderilmesine izin verir. Ancak, daha yap\u0131sal ve karma\u015f\u0131k veriler g\u00f6ndermek istedi\u011finizde, JSON format\u0131n\u0131 kullanmak en iyi yakla\u015f\u0131md\u0131r. Bu, istemci taraf\u0131nda verileri kolayca ayr\u0131\u015ft\u0131rman\u0131z\u0131 ve kullanman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ ASP.NET Core Backend\napp.MapGet(\"\/json-events\", async context =>\n{\n    context.Response.ContentType = \"text\/event-stream\";\n    \/\/ ... di\u011fer ba\u015fl\u0131klar ...\n\n    var eventData = new {\n        Timestamp = DateTime.Now,\n        Message = \"Yeni bir bildiriminiz var!\",\n        Type = \"notification\",\n        UserId = 123\n    };\n    var jsonMessage = System.Text.Json.JsonSerializer.Serialize(eventData);\n    await context.Response.WriteAsync($\"data: {jsonMessage}\\n\\n\");\n    await context.Response.Body.FlushAsync();\n});\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-javascript\"><\/pre>\n<p><\/code><br \/>\n\/\/ Frontend JavaScript<br \/>\neventSource.onmessage = function(event) {<br \/>\n    const data = JSON.parse(event.data);<br \/>\n    console.log(\"Gelen Veri:\", data);<br \/>\n    if (data.Type === \"notification\") {<br \/>\n        alert(data.Message);<br \/>\n    }<br \/>\n};<br \/>\n    <\/code><\/p>\n<h3>2. Hata Y\u00f6netimi ve Otomatik Yeniden Ba\u011flanma Stratejileri<\/h3>\n<p><code>EventSource<\/code> API'si, otomatik yeniden ba\u011flanma \u00f6zelli\u011fini yerle\u015fik olarak sunsa da, sunucu taraf\u0131nda da bu durumu y\u00f6netmek \u00f6nemlidir. \u0130stemci ba\u011flant\u0131s\u0131n\u0131n kesildi\u011fini (\u00f6rne\u011fin taray\u0131c\u0131 kapat\u0131ld\u0131\u011f\u0131nda) sunucunun anlamas\u0131 ve gereksiz kaynaklar\u0131 serbest b\u0131rakmas\u0131 gerekir. Yukar\u0131daki \u00f6rneklerde kullan\u0131lan <code>context.RequestAborted.IsCancellationRequested<\/code> kontrol\u00fc bunun i\u00e7in kritiktir. Ayr\u0131ca, sunucudan istemciye g\u00f6nderilen olaylar\u0131n <code>id:<\/code> alan\u0131na sahip olmas\u0131, istemcinin ba\u011flant\u0131 kesintisi sonras\u0131 hangi olaydan devam etmesi gerekti\u011fini belirtmesi a\u00e7\u0131s\u0131ndan \u00f6nemlidir (<code>Last-Event-ID<\/code> ba\u015fl\u0131\u011f\u0131 ile).<\/p>\n<p>\u0130stemci taraf\u0131nda <code>onerror<\/code> olay\u0131n\u0131 daha detayl\u0131 ele alarak, ba\u011flant\u0131 sorunlar\u0131n\u0131n nedenini loglayabilir ve kullan\u0131c\u0131ya bilgilendirici mesajlar g\u00f6sterebilirsiniz. Yeniden ba\u011flanma s\u00fcresini kontrol etmek i\u00e7in sunucudan <code>retry:<\/code> alan\u0131 g\u00f6nderebilirsiniz (\u00f6rne\u011fin, <code>retry: 5000\\n<\/code> 5 saniye sonra yeniden deneme yapar).<\/p>\n<h3>3. \u00d6l\u00e7eklenebilirlik ve Da\u011f\u0131t\u0131k Sistemlerde SSE<\/h3>\n<p>Tek bir sunucu \u00fczerinde SSE uygulamas\u0131 \u00e7al\u0131\u015ft\u0131rmak basittir, ancak uygulaman\u0131z \u00f6l\u00e7eklendik\u00e7e, birden fazla sunucuya yay\u0131lmas\u0131 gerekebilir. Bu durumda, SSE ba\u011flant\u0131lar\u0131n\u0131n hangi sunucuda oldu\u011funu takip etmek ve belirli bir istemciye mesaj g\u00f6ndermek zorla\u015f\u0131r. \u0130\u015fte bu noktada mesaj kuyruklar\u0131 (\u00f6rne\u011fin RabbitMQ, Kafka) veya da\u011f\u0131t\u0131lm\u0131\u015f \u00f6nbellek sistemleri (Redis Pub\/Sub) gibi ara\u00e7lar devreye girer. Sunucular, olaylar\u0131 bu merkezi sistemlere g\u00f6nderir ve SSE ba\u011flant\u0131lar\u0131n\u0131 y\u00f6neten sunucular da bu olaylar\u0131 dinleyerek ilgili istemcilere iletir. Bu yakla\u015f\u0131m, SSE ba\u011flant\u0131lar\u0131n\u0131n birden fazla sunucu aras\u0131nda da\u011f\u0131t\u0131lmas\u0131na olanak tan\u0131r ve uygulaman\u0131z\u0131n yatay \u00f6l\u00e7eklenmesini sa\u011flar.<\/p>\n<h3>4. G\u00fcvenlik ve Kimlik Do\u011frulama\/Yetkilendirme<\/h3>\n<p>SSE ba\u011flant\u0131lar\u0131 da di\u011fer HTTP ba\u011flant\u0131lar\u0131 gibi g\u00fcvenli olmal\u0131d\u0131r. HTTPS kullanmak (SSL\/TLS) ileti\u015fim trafi\u011fini \u015fifreleyerek man-in-the-middle sald\u0131r\u0131lar\u0131n\u0131 \u00f6nler. Ayr\u0131ca, bir SSE ak\u0131\u015f\u0131na ba\u011flanmak i\u00e7in kimlik do\u011frulama ve yetkilendirme mekanizmalar\u0131 kullanmak esast\u0131r. Bu, genellikle ba\u011flant\u0131 iste\u011fi s\u0131ras\u0131nda JWT (JSON Web Token) veya \u00e7erez tabanl\u0131 kimlik do\u011frulama ile ger\u00e7ekle\u015ftirilebilir. \u0130stemci, <code>EventSource<\/code> objesini olu\u015ftururken istek ba\u015fl\u0131klar\u0131na kimlik do\u011frulama token'\u0131n\u0131 ekleyemez (<code>EventSource<\/code> API'sinin do\u011frudan ba\u015fl\u0131k ekleme deste\u011fi yoktur). Bu nedenle, token genellikle URL parametresi olarak g\u00f6nderilir veya \u00f6nceden bir \u00e7erez ile kimlik do\u011frulama yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ E\u011fer token URL'den g\u00f6nderiliyorsa (daha az g\u00fcvenli olabilir, dikkatli kullan\u0131lmal\u0131)\nconst token = \"YOUR_AUTH_TOKEN\"; \/\/ G\u00fcvenli bir \u015fekilde al\u0131nmal\u0131\nconst eventSource = new EventSource(<code>\/sse?token=${token}<\/code>);\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: SSE i\u00e7in kimlik do\u011frulama yaparken, <code>EventSource<\/code> API'sinin do\u011frudan \u00f6zel HTTP ba\u015fl\u0131klar\u0131 eklemeye izin vermedi\u011fini unutmay\u0131n. \u00c7erez tabanl\u0131 kimlik do\u011frulama veya JWT'yi URL parametresi olarak g\u00f6nderme (ancak XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 dikkatli olunmal\u0131d\u0131r) yayg\u0131n \u00e7\u00f6z\u00fcmlerdir.\n    <\/div>\n<h3>5. SSE vs. SignalR: Ne Zaman Hangisi?<\/h3>\n<p>ASP.NET Core ekosisteminde ger\u00e7ek zamanl\u0131 ileti\u015fim denince akla ilk gelen teknolojilerden biri de SignalR'd\u0131r. Peki, SSE varken neden SignalR kullanmal\u0131y\u0131z veya tam tersi? \u0130\u015fte k\u0131sa bir kar\u015f\u0131la\u015ft\u0131rma:<\/p>\n<ul>\n<li><strong>SSE:<\/strong> Tek y\u00f6nl\u00fc (sunucudan istemciye) ileti\u015fim i\u00e7in tasarlanm\u0131\u015ft\u0131r. Basitli\u011fi, HTTP \u00fczerine kurulu olmas\u0131 ve yerle\u015fik yeniden ba\u011flanma deste\u011fi avantajlar\u0131d\u0131r. Taray\u0131c\u0131 deste\u011fi yayg\u0131nd\u0131r (IE hari\u00e7). E\u011fer uygulaman\u0131z sadece sunucudan bildirimler, ak\u0131\u015flar veya g\u00fcncellemeler alacaksa, SSE m\u00fckemmel ve hafif bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/li>\n<li><strong>SignalR:<\/strong> Tam \u00e7ift y\u00f6nl\u00fc (sunucu-istemci ve istemci-sunucu) ileti\u015fim sa\u011flar. WebSockets'\u0131 destekler, ancak taray\u0131c\u0131 veya a\u011f ko\u015fullar\u0131 uygun olmad\u0131\u011f\u0131nda otomatik olarak uzun polling gibi di\u011fer ta\u015f\u0131ma y\u00f6ntemlerine geri d\u00f6ner. Grup y\u00f6netimi, ba\u011flant\u0131 y\u00f6netimi, kimlik do\u011frulama gibi zengin \u00f6zellik setine sahiptir. Anl\u0131k sohbet uygulamalar\u0131, \u00e7ok kullan\u0131c\u0131l\u0131 oyunlar veya karma\u015f\u0131k \u00e7ift y\u00f6nl\u00fc etkile\u015fim gerektiren senaryolar i\u00e7in idealdir.<\/li>\n<\/ul>\n<p>\u00d6zetle, basit tek y\u00f6nl\u00fc bildirimler ve veri ak\u0131\u015flar\u0131 i\u00e7in SSE yeterli ve daha az karma\u015f\u0131kt\u0131r. Ancak, istemciden sunucuya da ger\u00e7ek zamanl\u0131 veri g\u00f6ndermeniz gerekiyorsa veya zengin bir ba\u011flant\u0131 ve grup y\u00f6netimi \u00f6zelli\u011fine ihtiyac\u0131n\u0131z varsa, SignalR daha g\u00fc\u00e7l\u00fc ve kapsaml\u0131 bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak ger\u00e7ek zamanl\u0131 sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 detayl\u0131ca inceledik. SSE'nin, \u00f6zellikle tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131, anl\u0131k bildirimler, canl\u0131 g\u00fcncellemeler ve ilerleme takibi gibi senaryolar i\u00e7in ne kadar basit ve etkili bir \u00e7\u00f6z\u00fcm oldu\u011funu g\u00f6rd\u00fck. ASP.NET Core'un esnek yap\u0131s\u0131 sayesinde, sadece birka\u00e7 sat\u0131r kod ile bir SSE endpoint'i olu\u015fturmak ve istemci taraf\u0131nda EventSource API'si ile bu ak\u0131\u015f\u0131 t\u00fcketmek olduk\u00e7a kolayd\u0131r. WebForms'tan ASP.NET Core'a ge\u00e7i\u015f yapan geli\u015ftiriciler i\u00e7in, SSE'nin olay tabanl\u0131 yakla\u015f\u0131m\u0131, ger\u00e7ek zamanl\u0131 gereksinimleri modern bir yakla\u015f\u0131mla kar\u015f\u0131lamak i\u00e7in tan\u0131d\u0131k ve verimli bir yol sunar. G\u00fcvenlik, \u00f6l\u00e7eklenebilirlik ve performans gibi ileri d\u00fczey konulara da de\u011finerek, daha sa\u011flam ve ger\u00e7ek d\u00fcnya uygulamalar\u0131 i\u00e7in ipu\u00e7lar\u0131 verdik. Umar\u0131z bu rehber, uygulamalar\u0131n\u0131za ger\u00e7ek zamanl\u0131 yetenekler kazand\u0131rman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. SSE her taray\u0131c\u0131da \u00e7al\u0131\u015f\u0131r m\u0131?<\/strong><\/p>\n<p>Evet, modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu (Chrome, Firefox, Safari, Edge, Opera) Server-Sent Events'\u0131 destekler. Ancak, Internet Explorer ve eski Edge (EdgeHTML) s\u00fcr\u00fcmleri SSE deste\u011fine sahip de\u011fildir. Bu nedenle, geni\u015f taray\u0131c\u0131 uyumlulu\u011fu gerekiyorsa ve IE gibi eski taray\u0131c\u0131lar\u0131 desteklemeniz \u015fartsa, alternatif \u00e7\u00f6z\u00fcmleri (\u00f6rn. long polling veya bir polyfill) de\u011ferlendirmeniz gerekebilir.<\/p>\n<p><strong>2. SSE ile WebSockets aras\u0131ndaki temel fark nedir?<\/strong><\/p>\n<p>En temel fark, ileti\u015fim y\u00f6n\u00fcd\u00fcr. SSE, sunucudan istemciye tek y\u00f6nl\u00fc (uni-directional) bir ileti\u015fim kanal\u0131n\u0131 HTTP \u00fczerinden kurar ve olay tabanl\u0131 veri ak\u0131\u015f\u0131 sa\u011flar. WebSockets ise, istemci ve sunucu aras\u0131nda tam \u00e7ift y\u00f6nl\u00fc (bi-directional) ve kal\u0131c\u0131 bir ba\u011flant\u0131 kurar. E\u011fer sadece sunucudan bildirimlere ihtiyac\u0131n\u0131z varsa SSE daha basit ve hafif bir \u00e7\u00f6z\u00fcmd\u00fcr. \u0130stemciden sunucuya da anl\u0131k veri g\u00f6ndermeniz gerekiyorsa WebSockets daha uygun bir se\u00e7enektir.<\/p>\n<p><strong>3. SSE g\u00fcvenlik a\u00e7\u0131s\u0131ndan nas\u0131l ele al\u0131n\u0131r?<\/strong><\/p>\n<p>SSE ba\u011flant\u0131lar\u0131 da standart HTTP ba\u011flant\u0131lar\u0131 gibi g\u00fcvenli olmal\u0131d\u0131r. Mutlaka HTTPS (SSL\/TLS) kullanarak veri trafi\u011fini \u015fifrelemelisiniz. Kimlik do\u011frulama ve yetkilendirme i\u00e7in ise, do\u011frudan EventSource API'si \u00f6zel ba\u015fl\u0131k g\u00f6ndermeye izin vermedi\u011fi i\u00e7in, genellikle ba\u011flant\u0131 iste\u011fi \u00f6ncesinde \u00e7erez tabanl\u0131 kimlik do\u011frulama yap\u0131l\u0131r veya JWT (JSON Web Token) URL parametresi olarak g\u00f6nderilir. Ancak URL parametresi kullan\u0131m\u0131, token'\u0131n loglarda g\u00f6r\u00fcnmesi gibi g\u00fcvenlik riskleri ta\u015f\u0131yabilece\u011finden dikkatli olunmal\u0131d\u0131r.<\/p>\n<p><strong>4. ASP.NET Core'da SSE i\u00e7in ek k\u00fct\u00fcphaneler gerekli mi?<\/strong><\/p>\n<p>Hay\u0131r, ASP.NET Core'da SSE uygulamak i\u00e7in herhangi bir \u00f6zel \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneye ihtiyac\u0131n\u0131z yoktur. Framework'\u00fcn kendi HTTP yan\u0131t ak\u0131\u015f\u0131 (<code>Response.Body.WriteAsync<\/code>, <code>FlushAsync<\/code>) ve <code>context.RequestAborted.IsCancellationRequested<\/code> gibi yerle\u015fik \u00f6zelliklerini kullanarak bir SSE endpoint'i kolayca olu\u015fturabilirsiniz. \u0130stemci taraf\u0131nda da modern taray\u0131c\u0131lar\u0131n yerle\u015fik <code>EventSource<\/code> API'si yeterlidir.<\/p>\n<p><strong>5. SSE'nin performans \u00fczerindeki etkisi nedir?<\/strong><\/p>\n<p>SSE, HTTP\/1.1 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in her ba\u011flant\u0131 kendi TCP ba\u011flant\u0131s\u0131n\u0131 kullan\u0131r ve sunucu kaynaklar\u0131 \u00fczerinde bir miktar y\u00fck olu\u015fturur. Ancak, WebSockets'a k\u0131yasla daha az protokol y\u00fck\u00fc ta\u015f\u0131r. \u00d6zellikle \u00e7ok say\u0131da ba\u011flant\u0131 veya y\u00fcksek mesaj frekans\u0131 beklenen durumlarda, HTTP\/2'nin \u00e7oklama (multiplexing) \u00f6zelli\u011fi sayesinde tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 y\u00f6netilebilir, bu da performans\u0131 art\u0131rabilir. Genellikle, sunucudan istemciye yo\u011fun tek y\u00f6nl\u00fc veri ak\u0131\u015flar\u0131 i\u00e7in olduk\u00e7a performansl\u0131 ve verimli bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131&hellip;","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":[1340],"tags":[],"class_list":{"0":"post-33911","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-net","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>ASP.NET Core&#039;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.\" \/>\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\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASP.NET Core&#039;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T16:31:01+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"ASP.NET Core&#8217;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim\",\"datePublished\":\"2025-11-08T16:31:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\"},\"wordCount\":3611,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\".NET\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\",\"name\":\"ASP.NET Core'da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T16:31:01+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ASP.NET Core&#8217;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim\"}]},{\"@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":"ASP.NET Core'da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim","description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.","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\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/","og_locale":"tr_TR","og_type":"article","og_title":"ASP.NET Core'da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim","og_description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.","og_url":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T16:31:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"ASP.NET Core&#8217;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim","datePublished":"2025-11-08T16:31:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/"},"wordCount":3611,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":[".NET"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/","url":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/","name":"ASP.NET Core'da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T16:31:01+00:00","description":"G\u00fcn\u00fcm\u00fcz\u00fcn dinamik web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na an\u0131nda ve g\u00fcncel bilgi sa\u011flamak zorundad\u0131r. Peki, sunucudan istemciye tek y\u00f6nl\u00fc, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 nas\u0131l etkin ve kolay bir \u015fekilde y\u00f6netebiliriz? Bu makalede, \u00f6zellikle ASP.NET Core ortam\u0131nda Server-Sent Events (SSE) teknolojisini kullanarak kesintisiz sunucu-istemci ileti\u015fimini nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer WebForms benzeri olay tabanl\u0131 bir yakla\u015f\u0131mdan geliyorsan\u0131z ve ASP.NET Core d\u00fcnyas\u0131nda ger\u00e7ek zamanl\u0131 bildirimler veya canl\u0131 veri ak\u0131\u015flar\u0131 olu\u015fturmak istiyorsan\u0131z, do\u011fru yerdesiniz. SSE, HTTP tabanl\u0131 basitli\u011fiyle bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc bir alternatiftir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-coreda-gercek-zamanli-sse-sunucudan-istemciye-kesintisiz-iletisim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ASP.NET Core&#8217;da Ger\u00e7ek Zamanl\u0131 SSE: Sunucudan \u0130stemciye Kesintisiz \u0130leti\u015fim"}]},{"@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\/33911","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=33911"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33911\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}