{"id":34148,"date":"2025-11-12T00:32:12","date_gmt":"2025-11-11T21:32:12","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/"},"modified":"2025-11-12T00:32:12","modified_gmt":"2025-11-11T21:32:12","slug":"asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/","title":{"rendered":"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme"},"content":{"rendered":"<p><body><\/p>\n<style>\n  \/* Mobil uyumlu tasar\u0131m i\u00e7in temel CSS kurallar\u0131 *\/\n  body {\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n    line-height: 1.6;\n    color: #333;\n    margin: 0 auto;\n    padding: 20px;\n    max-width: 960px;\n    background-color: #fcfcfc;\n  }\n  h2, h3 {\n    color: #0056b3;\n    margin-top: 30px;\n    margin-bottom: 15px;\n  }\n  h2 {\n      font-size: 2em;\n  }\n  h3 {\n      font-size: 1.5em;\n  }\n  p {\n      margin-bottom: 15px;\n  }\n  pre {\n    background-color: #f4f4f4;\n    padding: 15px;\n    border-left: 5px solid #0056b3;\n    overflow-x: auto;\n    margin-bottom: 20px;\n    border-radius: 4px;\n  }\n  code {\n    font-family: 'Consolas', 'Monaco', monospace;\n    font-size: 0.9em;\n  }\n  .expert-tip {\n    background-color: #e0f7fa;\n    border-left: 4px solid #00bcd4;\n    padding: 15px;\n    margin: 20px 0;\n    font-style: italic;\n    color: #00796b;\n    border-radius: 4px;\n  }\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 20px 0;\n    box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n    border-radius: 4px;\n    overflow: hidden; \/* Ensure rounded corners for table *\/\n  }\n  th, td {\n    border: 1px solid #eee;\n    padding: 12px 15px;\n    text-align: left;\n  }\n  th {\n    background-color: #e9f5ff;\n    font-weight: bold;\n    color: #0056b3;\n  }\n  tr:nth-child(even) {\n    background-color: #f9f9f9;\n  }\n  tr:hover {\n    background-color: #f1f1f1;\n  }\n  ul, ol {\n    margin-left: 20px;\n    margin-bottom: 15px;\n  }\n  li {\n    margin-bottom: 8px;\n  }<\/p>\n<p>  \/* Mobil cihazlar i\u00e7in medya sorgular\u0131 *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 15px;\n    }\n    h2 {\n      font-size: 1.6em;\n    }\n    h3 {\n      font-size: 1.3em;\n    }\n    table, thead, tbody, th, td, tr {\n      display: block;\n    }\n    thead tr {\n      position: absolute;\n      top: -9999px;\n      left: -9999px;\n    }\n    tr {\n      margin-bottom: 15px;\n      border: 1px solid #ddd;\n      border-radius: 4px;\n      overflow: hidden;\n    }\n    td {\n      border: none;\n      border-bottom: 1px solid #eee;\n      position: relative;\n      padding-left: 50%;\n      text-align: right;\n    }\n    td:last-child {\n        border-bottom: none;\n    }\n    td:before {\n      position: absolute;\n      top: 12px;\n      left: 15px;\n      width: 45%;\n      padding-right: 10px;\n      white-space: nowrap;\n      text-align: left;\n      font-weight: bold;\n      color: #555;\n    }\n    \/* Tablo ba\u015fl\u0131klar\u0131n\u0131 data-label ile g\u00f6sterme *\/\n    td:nth-of-type(1):before { content: \"\u00d6zellik\"; }\n    td:nth-of-type(2):before { content: \"AJAX\/JSON\"; }\n    td:nth-of-type(3):before { content: \"SignalR\"; }\n  }\n<\/style>\n<p>Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.<\/p>\n<p>Baz\u0131 geli\u015ftiricilerin zihninde &#8220;WebForms Core 2&#8221; gibi bir kavram belirebilir; ancak, Microsoft&#8217;un .NET ekosisteminde bu terim standart de\u011fildir. WebForms, ASP.NET&#8217;in daha eski, olay tabanl\u0131 bir modeliyken, .NET Core (\u015fimdiki ad\u0131yla sadece .NET), modern, performans odakl\u0131 ve \u00e7apraz platform bir \u00e7er\u00e7evedir. Bu makalede, &#8220;WebForms Core 2&#8221; teriminin modern bir ASP.NET ba\u011flam\u0131nda sunucudan istemciye mesaj g\u00f6nderme ihtiyac\u0131n\u0131 ifade etti\u011fi varsay\u0131larak, g\u00fcncel ASP.NET Core platformunun sundu\u011fu g\u00fc\u00e7l\u00fc yeteneklere odaklanaca\u011f\u0131z. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n arka plan\u0131nda neler olup bitti\u011fini, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc kesintiye u\u011fratmadan ve son kullan\u0131c\u0131ya g\u00f6r\u00fcnmeden izleyebilmeniz i\u00e7in size gerekli ara\u00e7lar\u0131 ve teknikleri sunmakt\u0131r. Bu modern yakla\u015f\u0131mlar, geleneksel WebForms uygulamalar\u0131nda kar\u015f\u0131la\u015f\u0131lan benzer ihtiya\u00e7lara daha performansl\u0131 ve \u00f6l\u00e7eklenebilir \u00e7\u00f6z\u00fcmler getirmektedir.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, bu tekniklerin de\u011feri daha da belirginle\u015fir. \u00d6rne\u011fin, bir e-ticaret sitesinde karma\u015f\u0131k bir sipari\u015f i\u015fleme veya \u00f6deme s\u00fcreci d\u00fc\u015f\u00fcn\u00fcn. Sunucu taraf\u0131nda bir\u00e7ok harici API \u00e7a\u011fr\u0131s\u0131, veritaban\u0131 i\u015flemi ve i\u015f mant\u0131\u011f\u0131 do\u011frulama ad\u0131m\u0131 ger\u00e7ekle\u015fir. Bu ad\u0131mlardan herhangi birinde bir hata veya beklenmedik bir durum olu\u015ftu\u011funda, geli\u015ftiricilerin bu durumu h\u0131zl\u0131ca tespit etmesi ve gidermesi gerekir. Sunucudan gelen detayl\u0131 mesajlar\u0131 do\u011frudan taray\u0131c\u0131 konsoluna yans\u0131tarak, geli\u015ftiriciler hem geli\u015ftirme a\u015famas\u0131nda hem de canl\u0131 sistemlerde kar\u015f\u0131la\u015f\u0131lan sorunlar\u0131 an\u0131nda te\u015fhis edebilirler. Bu y\u00f6ntem, son kullan\u0131c\u0131ya genel bir &#8220;bir hata olu\u015ftu&#8221; mesaj\u0131 g\u00f6stermek yerine, geli\u015ftiricilere spesifik hata k\u00f6kenini g\u00f6stererek hata ay\u0131klama verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ayr\u0131ca, uygulaman\u0131n performans\u0131n\u0131 veya kullan\u0131c\u0131 deneyimini olumsuz etkilemeden geli\u015ftiriciye \u00f6zel bilgiler sunar. \u015eimdi, bu g\u00fc\u00e7l\u00fc ileti\u015fim y\u00f6ntemlerinin temel ta\u015flar\u0131n\u0131 olu\u015fturan kavramlara daha yak\u0131ndan g\u00f6z atal\u0131m.<\/p>\n<h2>Temel Kavramlar: Sunucu ve \u0130stemci \u0130leti\u015fiminde Bilmeniz Gerekenler Nelerdir?<\/h2>\n<p>Web uygulamalar\u0131n\u0131n kalbinde, sunucu ve istemci aras\u0131ndaki dinamik ileti\u015fim yatar. Sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6nderme tekniklerini kavramadan \u00f6nce, bu ileti\u015fimin temel prensiplerini anlamak hayati \u00f6nem ta\u015f\u0131r. Geleneksel olarak, bu ileti\u015fim HTTP protokol\u00fc \u00fczerinden i\u015fleyen bir istek-cevap d\u00f6ng\u00fcs\u00fcyle ger\u00e7ekle\u015fir: istemci (taray\u0131c\u0131) bir HTTP iste\u011fi g\u00f6nderir ve sunucu bir HTTP yan\u0131t\u0131yla kar\u015f\u0131l\u0131k verir. Ancak, bu tek y\u00f6nl\u00fc model, modern web uygulamalar\u0131n\u0131n gerektirdi\u011fi anl\u0131k veya \u00e7ift y\u00f6nl\u00fc etkile\u015fimler i\u00e7in her zaman yeterli de\u011fildir. Bu noktada, farkl\u0131 ileti\u015fim mekanizmalar\u0131 ve API&#8217;ler devreye girer.<\/p>\n<p>\u0130lk olarak, taray\u0131c\u0131lar\u0131n geli\u015ftirici ara\u00e7lar\u0131nda bulunan JavaScript Console API&#8217;si, istemci taraf\u0131nda mesajlar\u0131 loglamak, uyar\u0131lar g\u00f6stermek veya hatalar\u0131 raporlamak i\u00e7in temel bir ara\u00e7t\u0131r. <code>console.log()<\/code>, <code>console.info()<\/code>, <code>console.warn()<\/code>, <code>console.error()<\/code> ve <code>console.debug()<\/code> gibi fonksiyonlar, mesajlar\u0131 farkl\u0131 \u00f6nem seviyelerinde \u00e7\u0131kt\u0131lar. Sunucudan gelen bilgileri taray\u0131c\u0131 konsolunda g\u00f6stermek istedi\u011fimizde, bu API&#8217;nin g\u00fcc\u00fcnden faydalanaca\u011f\u0131z. \u00d6rne\u011fin, sunucudan ba\u015far\u0131l\u0131 bir i\u015flem mesaj\u0131 geldi\u011finde <code>console.info()<\/code> kullanarak ye\u015fil bir \u00e7\u0131kt\u0131, kritik bir hata durumunda ise <code>console.error()<\/code> kullanarak k\u0131rm\u0131z\u0131 bir \u00e7\u0131kt\u0131 ile konsolda mesajlar\u0131 g\u00f6rsel olarak ay\u0131rt edebiliriz. Bu, hata ay\u0131klama s\u0131ras\u0131nda \u00f6nemli bilgilerin h\u0131zla fark edilmesini sa\u011flar.<\/p>\n<p>Daha geli\u015fmi\u015f ileti\u015fim yakla\u015f\u0131mlar\u0131na bakt\u0131\u011f\u0131m\u0131zda, WebSockets ve SignalR \u00f6ne \u00e7\u0131kar. WebSockets, istemci ve sunucu aras\u0131nda kal\u0131c\u0131, \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 kurarak anl\u0131k veri al\u0131\u015fveri\u015fini m\u00fcmk\u00fcn k\u0131lar. Bu kanal sayesinde, sunucu herhangi bir zamanda istemciye veri g\u00f6nderebilir ve istemci de sunucuya ayn\u0131 \u015fekilde veri iletebilir. Geleneksel HTTP&#8217;nin her istek i\u00e7in ayr\u0131 bir ba\u011flant\u0131 kurma maliyetine k\u0131yasla, WebSockets daha d\u00fc\u015f\u00fck gecikme s\u00fcresi ve daha az a\u011f trafi\u011fi (overhead) ile ger\u00e7ek zamanl\u0131 uygulamalar i\u00e7in idealdir. ASP.NET Core ekosisteminde ise, SignalR, WebSockets&#8217;\u0131n \u00fczerine in\u015fa edilmi\u015f ve bu karma\u015f\u0131k ger\u00e7ek zamanl\u0131 ileti\u015fim altyap\u0131s\u0131n\u0131 soyutlayarak geli\u015ftiricilere kullan\u0131m\u0131 kolay bir API sunan g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. SignalR, arkaplanda otomatik olarak WebSockets, Server-Sent Events veya Long Polling gibi en uygun ta\u015f\u0131ma y\u00f6ntemini se\u00e7erek geli\u015ftiricileri d\u00fc\u015f\u00fck seviyeli ileti\u015fim detaylar\u0131ndan kurtar\u0131r.<\/p>\n<p>Peki, sunucudan gelen mesajlar\u0131 neden do\u011frudan HTML \u00e7\u0131kt\u0131s\u0131 yerine konsola g\u00f6ndermeliyiz? Birincisi, gizlilik ve g\u00fcvenlik. Hassas hata bilgileri veya arka plan i\u015flem detaylar\u0131 son kullan\u0131c\u0131ya g\u00f6sterilmemelidir. Konsol mesajlar\u0131, yaln\u0131zca geli\u015ftirici ara\u00e7lar\u0131n\u0131 a\u00e7an yetkili ki\u015filer taraf\u0131ndan g\u00f6r\u00fcnt\u00fclenebilir. \u0130kincisi, kullan\u0131c\u0131 deneyimi. Sayfada s\u00fcrekli a\u00e7\u0131l\u0131r pencereler, modal kutular veya uyar\u0131 mesajlar\u0131 g\u00f6stermek, kullan\u0131c\u0131 ak\u0131\u015f\u0131n\u0131 bozar ve can s\u0131k\u0131c\u0131 olabilir. Konsol mesajlar\u0131, bu t\u00fcr kesintilere neden olmadan geli\u015ftiricilere bilgi sa\u011flar. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, geli\u015ftirici odakl\u0131l\u0131k. Konsol, geli\u015ftiricilerin kodlar\u0131n\u0131 test ederken, sorun giderirken veya uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 izlerken ihtiya\u00e7 duyduklar\u0131 t\u00fcm bilgileri d\u00fczenli ve filtrelenebilir bir \u015fekilde sunmak \u00fczere tasarlanm\u0131\u015ft\u0131r. Bu temel kavramlar \u0131\u015f\u0131\u011f\u0131nda, \u015fimdi ASP.NET Core&#8217;da sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6ndermek i\u00e7in pratik y\u00f6ntemlere ge\u00e7i\u015f yapal\u0131m.<\/p>\n<h2>Uygulamal\u0131 K\u0131s\u0131m: ASP.NET Core&#8217;da Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj Nas\u0131l G\u00f6nderilir?<\/h2>\n<p>ASP.NET Core uygulamalar\u0131nda sunucu taraf\u0131ndaki bilgileri taray\u0131c\u0131 konsoluna aktarman\u0131n birden fazla etkili yolu vard\u0131r. Bu b\u00f6l\u00fcmde, en yayg\u0131n ve i\u015flevsel iki yakla\u015f\u0131m\u0131, detayl\u0131 kod \u00f6rnekleriyle birlikte inceleyece\u011fiz: AJAX ve JSON kullanarak dinamik veri aktar\u0131m\u0131 ile SignalR arac\u0131l\u0131\u011f\u0131yla ger\u00e7ek zamanl\u0131 mesajla\u015fma. Her bir y\u00f6ntem, farkl\u0131 uygulama senaryolar\u0131na ve gereksinimlerine g\u00f6re avantajlar sunar.<\/p>\n<h3>Y\u00f6ntem 1: AJAX ve JSON Kullanarak Dinamik Veri Aktar\u0131m\u0131<\/h3>\n<p>Bu y\u00f6ntem, istemcinin ba\u015flatt\u0131\u011f\u0131 bir HTTP iste\u011fine yan\u0131t olarak sunucudan tek seferlik veya periyodik bilgi almas\u0131 ve bu bilgiyi konsolda g\u00f6r\u00fcnt\u00fclemesi i\u00e7in idealdir. \u0130stemci taraf\u0131ndaki JavaScript (genellikle <code>fetch<\/code> API veya <code>XMLHttpRequest<\/code> kullanarak), sunucuya bir AJAX iste\u011fi g\u00f6nderir. Sunucu, i\u015flemi tamamlad\u0131ktan sonra genellikle JSON format\u0131nda bir yan\u0131t d\u00f6nd\u00fcr\u00fcr. \u0130stemci bu JSON yan\u0131t\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131r ve i\u00e7indeki mesajlar\u0131 taray\u0131c\u0131 konsoluna yazar.<\/p>\n<h4>Sunucu Taraf\u0131 (ASP.NET Core Controller):<\/h4>\n<p>Bir kontrolc\u00fc metodu (Action) tan\u0131mlayarak i\u015fleme ba\u015flayal\u0131m. Bu metot, belirli bir g\u00f6revi yerine getirecek ve sonucunu JSON olarak d\u00f6nd\u00fcrecektir. A\u015fa\u011f\u0131daki \u00f6rnekte, bir sayac\u0131 art\u0131ran veya bir hata durumunu sim\u00fcle eden iki farkl\u0131 Action metodu bulunmaktad\u0131r:<\/p>\n<pre><code>\nusing Microsoft.AspNetCore.Mvc;\nusing System; \/\/ DateTime i\u00e7in\n\npublic class HomeController : Controller\n{\n    private static int _counter = 0; \/\/ Basit bir saya\u00e7\n\n    \/\/ GET \/Home\/GetConsoleMessage\n    [HttpGet]\n    public IActionResult GetConsoleMessage()\n    {\n        _counter++; \/\/ Sayac\u0131 her \u00e7a\u011fr\u0131da art\u0131r\n        var message = $\"Sunucudan al\u0131nan de\u011fer: {_counter}. \u0130\u015flem ba\u015far\u0131yla tamamland\u0131.\";\n        var responseData = new {\n            Success = true,\n            Message = message,\n            Timestamp = DateTime.UtcNow\n        };\n        \/\/ JavaScript konsolunda kolayca i\u015flenebilmesi i\u00e7in JSON format\u0131nda yan\u0131t d\u00f6n\u00fcyoruz\n        return Json(responseData);\n    }\n\n    \/\/ GET \/Home\/GetErrorConsoleMessage - Hata durumu sim\u00fclasyonu\n    [HttpGet]\n    public IActionResult GetErrorConsoleMessage()\n    {\n        try\n        {\n            \/\/ Ger\u00e7ek bir hata f\u0131rlatarak hata mesaj\u0131 olu\u015fturma\n            throw new InvalidOperationException(\"Beklenmedik bir sunucu hatas\u0131 olu\u015ftu!\");\n        }\n        catch (Exception ex)\n        {\n            var errorData = new {\n                Success = false,\n                ErrorMessage = ex.Message,\n                ErrorCode = 500,\n                Timestamp = DateTime.UtcNow\n            };\n            return Json(errorData); \/\/ Hata detaylar\u0131n\u0131 JSON olarak d\u00f6nd\u00fcr\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>GetConsoleMessage<\/code> her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir sayac\u0131 art\u0131r\u0131r ve ba\u015far\u0131 durumunu belirtir, <code>GetErrorConsoleMessage<\/code> ise kontroll\u00fc bir hata f\u0131rlatarak bu hatay\u0131 JSON olarak istemciye iletir. Bu JSON nesneleri, istemci taraf\u0131nda rahatl\u0131kla ayr\u0131\u015ft\u0131r\u0131l\u0131p konsola yaz\u0131labilir.<\/p>\n<h4>\u0130stemci Taraf\u0131 (JavaScript):<\/h4>\n<p>\u015eimdi, bu sunucu metotlar\u0131n\u0131 \u00e7a\u011f\u0131racak ve d\u00f6nen JSON yan\u0131tlar\u0131n\u0131 taray\u0131c\u0131 konsoluna yazacak bir JavaScript kodu olu\u015ftural\u0131m. <code>fetch<\/code> API'si, modern JavaScript'te HTTP istekleri yapmak i\u00e7in tercih edilen y\u00f6ntemdir:<\/p>\n<pre><code>\n<script>\n    async function fetchServerConsoleMessage(isError = false) {\n        \/\/ Hata veya ba\u015far\u0131 mesaj\u0131 i\u00e7in do\u011fru URL'i se\u00e7\n        const url = isError ? '\/Home\/GetErrorConsoleMessage' : '\/Home\/GetConsoleMessage';\n        try {\n            const response = await fetch(url);\n            if (!response.ok) {\n                \/\/ HTTP yan\u0131t\u0131 ba\u015far\u0131s\u0131zsa bile konsola bilgi verelim\n                console.error(<code>HTTP Hatas\u0131: ${response.status} ${response.statusText}<\/code>);\n                const errorText = await response.text();\n                console.error(\"Detayl\u0131 Sunucu Yan\u0131t\u0131:\", errorText);\n                return;\n            }\n            const data = await response.json(); \/\/ JSON yan\u0131t\u0131n\u0131 ayr\u0131\u015ft\u0131r\n            \n            if (data.Success) {\n                console.info(\"Ba\u015far\u0131l\u0131 Sunucu Mesaj\u0131:\", data.Message, <code>(Zaman: ${new Date(data.Timestamp).toLocaleTimeString()})<\/code>);\n            } else {\n                console.error(\"Sunucu Taraf\u0131nda Hata Alg\u0131land\u0131:\", data.ErrorMessage, <code>(Kod: ${data.ErrorCode}, Zaman: ${new Date(data.Timestamp).toLocaleTimeString()})<\/code>);\n            }\n        } catch (error) {\n            console.error(\"\u0130stek i\u015flenirken beklenmedik bir hata olu\u015ftu:\", error);\n        }\n    }\n\n    \/\/ Sayfa y\u00fcklendi\u011finde veya bir kullan\u0131c\u0131 eylemiyle tetiklenecek \u00f6rnek d\u00fc\u011fmeler\n    document.addEventListener('DOMContentLoaded', () => {\n        const buttonSuccess = document.createElement('button');\n        buttonSuccess.textContent = 'Ba\u015far\u0131l\u0131 Mesaj Al (AJAX)';\n        buttonSuccess.style.marginRight = '10px';\n        buttonSuccess.onclick = () => fetchServerConsoleMessage(false);\n        document.body.appendChild(buttonSuccess);\n\n        const buttonError = document.createElement('button');\n        buttonError.textContent = 'Hata Mesaj\u0131 Al (AJAX)';\n        buttonError.onclick = () => fetchServerConsoleMessage(true);\n        document.body.appendChild(buttonError);\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu JavaScript kodu, <code>fetchServerConsoleMessage<\/code> fonksiyonu ile sunucudaki Action metodunu \u00e7a\u011f\u0131r\u0131r. D\u00f6nen JSON verisini <code>data.Success<\/code> \u00f6zelli\u011fine g\u00f6re kontrol ederek, <code>console.info<\/code> veya <code>console.error<\/code> metotlar\u0131n\u0131 kullanarak ilgili mesajlar\u0131 taray\u0131c\u0131 konsoluna yazar. Bu, uygulaman\u0131n arka plan\u0131nda d\u00f6nen i\u015flemlerin durumunu anl\u0131k olarak konsoldan takip etmenizi sa\u011flar. \u00d6zellikle belirli bir olay veya kullan\u0131c\u0131 eylemi sonras\u0131nda sunucu durumunu kontrol etmek istedi\u011finizde bu y\u00f6ntem olduk\u00e7a etkilidir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Geli\u015ftirme ortam\u0131nda (development environment) daha fazla detay i\u00e7eren mesajlar g\u00f6nderirken, \u00fcretim ortam\u0131nda (production environment) sadece kritik hata mesajlar\u0131n\u0131 veya \u00f6zet bilgileri g\u00f6nderecek \u015fekilde sunucu taraf\u0131 kodunuzu yap\u0131land\u0131rmak, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131r\u0131r.\n<\/div>\n<h3>Y\u00f6ntem 2: SignalR ile Ger\u00e7ek Zamanl\u0131 Mesajla\u015fma<\/h3>\n<p>AJAX, istemcinin ba\u015flatt\u0131\u011f\u0131 istek-cevap d\u00f6ng\u00fcleri i\u00e7in m\u00fckemmel olsa da, sunucunun istemciye herhangi bir zamanda kendili\u011finden mesaj g\u00f6ndermesi gerekti\u011finde yetersiz kal\u0131r. \u0130\u015fte bu noktada SignalR, sunucu ve istemci aras\u0131nda kal\u0131c\u0131, \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 kurarak ger\u00e7ek zamanl\u0131 ileti\u015fimi m\u00fcmk\u00fcn k\u0131lar. Bu, anl\u0131k bildirimler, canl\u0131 g\u00fcncellemeler veya arka planda uzun s\u00fcreli \u00e7al\u0131\u015fan i\u015flemlerin durumunu izlemek i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h4>ASP.NET Core'da SignalR Yap\u0131land\u0131rmas\u0131:<\/h4>\n<p>SignalR'\u0131 kullanabilmek i\u00e7in \u00f6ncelikle ASP.NET Core projenize eklemeniz ve yap\u0131land\u0131rman\u0131z gerekir. <code>Program.cs<\/code> dosyan\u0131zda a\u015fa\u011f\u0131daki gibi bir kurulum yapmal\u0131s\u0131n\u0131z:<\/p>\n<pre><code>\n\/\/ Program.cs i\u00e7eri\u011fi\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n\/\/ SignalR servislerini ba\u011f\u0131ml\u0131l\u0131k ekleme sistemine kaydet\nbuilder.Services.AddSignalR();\nbuilder.Services.AddControllersWithViews();\n\nvar app = builder.Build();\n\nif (!app.Environment.IsDevelopment())\n{\n    app.UseExceptionHandler(\"\/Home\/Error\");\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\napp.UseRouting();\napp.UseAuthorization();\n\n\/\/ SignalR Hub'\u0131 belirli bir URL'e haritala\napp.MapHub<ConsoleMessageHub>(\"\/consoleHub\"); \/\/ \u0130stemciler bu adres \u00fczerinden Hub'a ba\u011flanacak\napp.MapControllerRoute(\n    name: \"default\",\n    pattern: \"{controller=Home}\/{action=Index}\/{id?}\");\n\napp.Run();\n<\/pre>\n<p><\/code><\/p>\n<h4>SignalR Hub Olu\u015fturma:<\/h4>\n<p>Bir Hub s\u0131n\u0131f\u0131, istemcilerle sunucu taraf\u0131nda ileti\u015fim kurmak i\u00e7in merkezi bir noktad\u0131r. <code>ConsoleMessageHub<\/code> ad\u0131nda basit bir Hub olu\u015ftural\u0131m:<\/p>\n<pre><code>\n\/\/ Hubs\/ConsoleMessageHub.cs\nusing Microsoft.AspNetCore.SignalR;\nusing System.Threading.Tasks;\n\npublic class ConsoleMessageHub : Hub\n{\n    \/\/ Bu Hub metodunu istemci do\u011frudan \u00e7a\u011f\u0131rabilir, ancak biz sunucudan mesaj g\u00f6ndermeye odaklan\u0131yoruz.\n    \/\/ Yine de, istemciden sunucuya mesaj g\u00f6nderme yetene\u011fini g\u00f6stermek i\u00e7in bir \u00f6rnek:\n    public async Task SendMessageToServer(string user, string message)\n    {\n        Console.WriteLine($\"\u0130stemciden gelen mesaj: {user} - {message}\");\n        \/\/ Gelen mesaj\u0131 t\u00fcm istemcilere geri g\u00f6nderebiliriz\n        await Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"Server Echo\", $\"'{user}' dedi ki: {message}\", \"info\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Sunucudan Hub Arac\u0131l\u0131\u011f\u0131yla Mesaj G\u00f6nderme:<\/h4>\n<p>Bir kontrolc\u00fcden veya ba\u015fka bir servisden <code>ConsoleMessageHub<\/code>'a eri\u015ferek ba\u011fl\u0131 istemcilere mesaj g\u00f6nderebiliriz. Bunun i\u00e7in <code>IHubContext<T><\/code> aray\u00fcz\u00fcn\u00fc ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ile kullan\u0131r\u0131z:<\/p>\n<pre><code>\n\/\/ Controllers\/ProcessController.cs (\u00d6rnek bir kontrolc\u00fc)\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.SignalR;\nusing System.Threading.Tasks;\n\npublic class ProcessController : Controller\n{\n    private readonly IHubContext<ConsoleMessageHub> _hubContext;\n\n    public ProcessController(IHubContext<ConsoleMessageHub> hubContext)\n    {\n        _hubContext = hubContext;\n    }\n\n    [HttpGet]\n    public async Task<IActionResult> StartLongRunningProcess()\n    {\n        \/\/ Arka planda uzun s\u00fcren bir i\u015flemi sim\u00fcle edelim ve her ad\u0131mda konsola bilgi g\u00f6nderelim\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"Server\", \"Uzun s\u00fcreli i\u015flem ba\u015flat\u0131ld\u0131...\", \"info\");\n        \n        await Task.Delay(2000); \/\/ 2 saniye beklet\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"Server\", \"Veritaban\u0131 i\u015flemleri ger\u00e7ekle\u015ftiriliyor...\", \"warn\");\n        \n        await Task.Delay(3000); \/\/ 3 saniye beklet\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"Server\", \"\u0130\u015flem ba\u015far\u0131yla tamamland\u0131!\", \"success\"); \/\/ Ba\u015far\u0131 i\u00e7in \u00f6zel tip\n        \n        return Ok(\"\u0130\u015flem komutu al\u0131nd\u0131. Durum g\u00fcncellemelerini taray\u0131c\u0131 konsolundan takip edebilirsiniz.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>ProcessController<\/code> \u00f6rne\u011finde, <code>StartLongRunningProcess<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, arka planda bir dizi olay ger\u00e7ekle\u015fti\u011fini sim\u00fcle eder ve her ad\u0131mda SignalR arac\u0131l\u0131\u011f\u0131yla t\u00fcm ba\u011fl\u0131 istemcilere konsol mesajlar\u0131 g\u00f6nderir.<\/p>\n<h4>\u0130stemci Taraf\u0131 (JavaScript):<\/h4>\n<p>\u0130stemci taraf\u0131nda, SignalR JavaScript istemci k\u00fct\u00fcphanesini kullanarak Hub'a ba\u011flanmam\u0131z ve sunucudan gelen mesajlar\u0131 dinlememiz gerekir. HTML dosyan\u0131zda SignalR k\u00fct\u00fcphanesini do\u011fru \u015fekilde ekledi\u011finizden emin olun (NuGet veya CDN arac\u0131l\u0131\u011f\u0131yla):<\/p>\n<pre><code>\n<!-- SignalR istemci k\u00fct\u00fcphanesini y\u00fckleyin -->\n<!-- \u00d6rne\u011fin: <script src=\"\/lib\/microsoft\/signalr\/dist\/browser\/signalr.min.js\"><\/script> -->\n<script src=\"~\/js\/signalr\/dist\/browser\/signalr.min.js\"><\/script>\n\n<script>\n    const connection = new signalR.HubConnectionBuilder()\n        .withUrl(\"\/consoleHub\") \/\/ Hub'\u0131n haritaland\u0131\u011f\u0131 adres\n        .configureLogging(signalR.LogLevel.Information) \/\/ SignalR'\u0131n kendi loglar\u0131n\u0131 g\u00f6rmek i\u00e7in\n        .build();\n\n    \/\/ Sunucudan gelen \"ReceiveConsoleMessage\" metodunu dinle\n    connection.on(\"ReceiveConsoleMessage\", (user, message, type) => {\n        const timestamp = new Date().toLocaleTimeString();\n        const formattedMessage = <code>[${timestamp}] ${user}: ${message}<\/code>;\n\n        switch (type) {\n            case \"info\":\n                console.info(formattedMessage);\n                break;\n            case \"warn\":\n                console.warn(formattedMessage);\n                break;\n            case \"error\":\n                console.error(formattedMessage);\n                break;\n            case \"success\": \/\/ \u00d6zel bir ba\u015far\u0131 tipi i\u00e7in renkli \u00e7\u0131kt\u0131\n                console.log(<code>%c${formattedMessage}<\/code>, 'color: green; font-weight: bold;');\n                break;\n            default:\n                console.log(formattedMessage);\n                break;\n        }\n    });\n\n    async function startSignalRConnection() {\n        try {\n            await connection.start();\n            console.log(\"SignalR ba\u011flant\u0131s\u0131 ba\u015far\u0131yla kuruldu.\");\n        } catch (err) {\n            console.error(\"SignalR ba\u011flant\u0131s\u0131 kurulamad\u0131:\", err);\n            setTimeout(() => startSignalRConnection(), 5000); \/\/ 5 saniye sonra tekrar dene\n        }\n    }\n\n    \/\/ Ba\u011flant\u0131 kesildi\u011finde otomatik olarak yeniden ba\u011flanmaya \u00e7al\u0131\u015f\n    connection.onclose(async () => {\n        console.warn(\"SignalR ba\u011flant\u0131s\u0131 kesildi. Yeniden ba\u011flanmaya \u00e7al\u0131\u015f\u0131l\u0131yor...\");\n        await startSignalRConnection();\n    });\n\n    document.addEventListener('DOMContentLoaded', () => {\n        startSignalRConnection(); \/\/ Sayfa y\u00fcklendi\u011finde SignalR ba\u011flant\u0131s\u0131n\u0131 ba\u015flat\n\n        \/\/ Sunucudaki uzun s\u00fcreli i\u015flemi tetiklemek i\u00e7in bir d\u00fc\u011fme ekleyelim\n        const processButton = document.createElement('button');\n        processButton.textContent = 'Uzun S\u00fcreli \u0130\u015flemi Ba\u015flat (SignalR)';\n        processButton.onclick = async () => {\n            try {\n                const response = await fetch('\/Process\/StartLongRunningProcess');\n                const text = await response.text();\n                console.log(\"Sunucu yan\u0131t\u0131 (i\u015flem tetikleme):\", text);\n            } catch (error) {\n                console.error(\"\u0130\u015flem ba\u015flatma iste\u011fi ba\u015far\u0131s\u0131z oldu:\", error);\n            }\n        };\n        document.body.appendChild(processButton);\n    });\n<\/script>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu karma\u015f\u0131k \u00f6rnekte, istemci SignalR Hub'\u0131na ba\u011flan\u0131r ve <code>ReceiveConsoleMessage<\/code> ad\u0131nda bir sunucu metodunu dinler. Sunucudan bu metot \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda (yukar\u0131daki <code>ProcessController<\/code> \u00f6rne\u011finde oldu\u011fu gibi), istemci JavaScript kodu gelen mesaj\u0131 al\u0131r ve <code>console.info<\/code>, <code>console.warn<\/code>, <code>console.error<\/code> veya <code>console.log<\/code> ile konsola yazar. <code>success<\/code> tipi i\u00e7in \u00f6zel olarak ye\u015fil renkli ve kal\u0131n bir \u00e7\u0131kt\u0131 ile bi\u00e7imlendirme yaparak konsol \u00e7\u0131kt\u0131lar\u0131n\u0131n daha anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011fl\u0131yoruz. Bu sayede, arka plandaki i\u015flemlerin canl\u0131 durumunu anl\u0131k olarak takip edebilir, herhangi bir sorun olu\u015ftu\u011funda hemen fark edebilirsiniz. SignalR, \u00f6zellikle interaktif ve ger\u00e7ek zamanl\u0131 hata ay\u0131klama senaryolar\u0131 i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: SignalR ba\u011flant\u0131s\u0131n\u0131 y\u00f6netirken, ba\u011flant\u0131 kesintilerini ele almak (<code>connection.onclose<\/code>) ve otomatik yeniden ba\u011flanma mant\u0131\u011f\u0131 (<code>setTimeout<\/code>) eklemek, uygulaman\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu, \u00f6zellikle a\u011f sorunlar\u0131 veya sunucu yeniden ba\u015flatmalar\u0131 gibi durumlarda kritik \u00f6neme sahiptir.\n<\/div>\n<h3>AJAX ve SignalR Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h3>\n<p>Sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6ndermek i\u00e7in AJAX\/JSON ve SignalR'\u0131 inceledik. Hangi y\u00f6ntemin projenize daha uygun oldu\u011funa karar vermeniz i\u00e7in ba\u015fl\u0131ca farklar\u0131 bir tabloda \u00f6zetleyelim:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>AJAX\/JSON<\/th>\n<th>SignalR<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0130leti\u015fim \u015eekli<\/td>\n<td>\u0130stek-cevap modeli (tek y\u00f6nl\u00fc, istemci ba\u015flat\u0131r)<\/td>\n<td>Ger\u00e7ek zamanl\u0131, \u00e7ift y\u00f6nl\u00fc (sunucu veya istemci ba\u015flatabilir)<\/td>\n<\/tr>\n<tr>\n<td>Kullan\u0131m Alanlar\u0131<\/td>\n<td>Tek seferlik veri al\u0131m\u0131, form g\u00f6nderimi sonras\u0131 geri bildirim, periyodik anket (polling)<\/td>\n<td>Anl\u0131k bildirimler, canl\u0131 sohbet, ger\u00e7ek zamanl\u0131 dashboard g\u00fcncellemeleri, uzun s\u00fcreli i\u015flem takibi<\/td>\n<\/tr>\n<tr>\n<td>Gecikme S\u00fcresi<\/td>\n<td>Her istekte yeni bir ba\u011flant\u0131 kuruldu\u011fundan daha y\u00fcksek<\/td>\n<td>Kal\u0131c\u0131 ba\u011flant\u0131 sayesinde d\u00fc\u015f\u00fck gecikme ve anl\u0131k tepki s\u00fcresi<\/td>\n<\/tr>\n<tr>\n<td>Karma\u015f\u0131kl\u0131k<\/td>\n<td>Daha basit bir yap\u0131land\u0131rma ve kullan\u0131m<\/td>\n<td>Ek kurulum ve konfig\u00fcrasyon gerektirir, daha karma\u015f\u0131k yap\u0131<\/td>\n<\/tr>\n<tr>\n<td>Ba\u011flant\u0131 T\u00fcr\u00fc<\/td>\n<td>Durumsuz (stateless) HTTP ba\u011flant\u0131lar\u0131<\/td>\n<td>Durumlu (stateful) kal\u0131c\u0131 ba\u011flant\u0131lar (WebSocket, SSE, Long Polling gibi)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu kar\u015f\u0131la\u015ft\u0131rma, projenizin gereksinimlerine g\u00f6re en do\u011fru teknolojiyi se\u00e7menize yard\u0131mc\u0131 olacakt\u0131r. Basit, tek seferlik bilgilendirmeler veya istemci taraf\u0131ndan tetiklenen durum g\u00fcncellemeleri i\u00e7in AJAX yeterliyken, dinamik ve anl\u0131k geri bildirimler, sunucu taraf\u0131ndan ba\u015flat\u0131lan uyar\u0131lar veya ger\u00e7ek zamanl\u0131 izleme i\u00e7in SignalR tart\u0131\u015fmas\u0131z daha g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir bir se\u00e7enektir.<\/p>\n<h2>\u0130leri D\u00fczey Teknikler: Hata Ay\u0131klama ve Performans \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6nderme yetene\u011fi, geli\u015ftirme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131rken, bu g\u00fcc\u00fc do\u011fru ve bilin\u00e7li kullanmak hem g\u00fcvenlik hem de performans a\u00e7\u0131s\u0131ndan kritik \u00f6nem ta\u015f\u0131r. Bu b\u00f6l\u00fcmde, bu teknikleri daha verimli kullanman\u0131z\u0131 sa\u011flayacak ileri d\u00fczey ipu\u00e7lar\u0131na ve en iyi pratiklere de\u011finece\u011fiz, b\u00f6ylece uygulaman\u0131z\u0131n kalitesini art\u0131rabilirsiniz.<\/p>\n<h3>Konsol Mesajlar\u0131n\u0131 Filtreleme ve Seviyelendirme<\/h3>\n<p>Taray\u0131c\u0131 konsolunda farkl\u0131 t\u00fcrdeki mesajlar\u0131 ay\u0131rt etmek ve y\u00f6netmek i\u00e7in \u00e7e\u015fitli seviyeler (log, info, warn, error, debug) kullanmak, konsol \u00e7\u0131kt\u0131s\u0131n\u0131 d\u00fczenli ve okunabilir k\u0131lar. Geli\u015ftirici ara\u00e7lar\u0131, bu seviyelere g\u00f6re filtreleme yapma imkan\u0131 sunar, bu da sadece ilgilendi\u011finiz mesajlara odaklanman\u0131z\u0131 sa\u011flar. Sunucu taraf\u0131nda g\u00f6nderdi\u011finiz mesajlar\u0131 bu seviyelere g\u00f6re kategorize etmek, istemci taraf\u0131nda da ayn\u0131 disiplini s\u00fcrd\u00fcrmenizi sa\u011flar. \u00d6rne\u011fin, bir kritik hata olu\u015ftu\u011funda <code>console.error()<\/code>, potansiyel bir sorunu belirtmek i\u00e7in <code>console.warn()<\/code>, genel bilgilendirme ama\u00e7l\u0131 mesajlar i\u00e7in <code>console.info()<\/code> veya <code>console.log()<\/code> ve sadece derinlemesine inceleme gerektiren durumlar i\u00e7in <code>console.debug()<\/code> kullanabilirsiniz. Bu katmanl\u0131 yakla\u015f\u0131m, konsolu temiz tutar ve \u00f6nemli mesajlar\u0131n g\u00f6zden ka\u00e7mas\u0131n\u0131 engeller.<\/p>\n<p>Sunucu taraf\u0131nda, hangi seviyede mesaj g\u00f6nderece\u011finizi dinamik olarak belirlemek i\u00e7in parametreler kullanabiliriz. \u00d6rne\u011fin, SignalR Hub \u00f6rne\u011fimizde <code>type<\/code> parametresi tam da bu amaca hizmet ediyordu. AJAX ile JSON d\u00f6nerken de, d\u00f6nen JSON objesine bir <code>LogLevel<\/code> veya <code>MessageType<\/code> alan\u0131 ekleyerek, istemci taraf\u0131nda buna g\u00f6re uygun <code>console<\/code> metodunu se\u00e7ebiliriz. Bu esnek yap\u0131land\u0131rma, geli\u015ftirme s\u0131ras\u0131nda detayl\u0131 bilgi al\u0131rken, \u00fcretim ortam\u0131nda sadece <code>error<\/code> seviyesindeki kritik mesajlar\u0131 g\u00f6stermenizi sa\u011flayabilir, b\u00f6ylece performans ve g\u00fcvenlik dengesi sa\u011flanm\u0131\u015f olur.<\/p>\n<h3>G\u00fcvenlik Endi\u015feleri ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Sunucudan gelen bilgileri do\u011frudan taray\u0131c\u0131 konsoluna aktarmak, hassas verilerin yanl\u0131\u015fl\u0131kla if\u015fa olmas\u0131na yol a\u00e7abilir. Bu nedenle g\u00fcvenlik, her zaman \u00f6ncelikli olmal\u0131d\u0131r. Kimlik bilgileri, API anahtarlar\u0131, veritaban\u0131 \u015fifreleri veya ki\u015fisel kullan\u0131c\u0131 verileri gibi hassas bilgilerin asla taray\u0131c\u0131 konsoluna yaz\u0131lmad\u0131\u011f\u0131ndan emin olun. Geli\u015ftirme ortam\u0131nda bile bu t\u00fcr verilere dikkat edilmeli, asla \u00fcretimde kullan\u0131lamayacak \u015fekilde maskelenmelidir.<\/p>\n<ul>\n<li><strong>\u00dcretim Ortam\u0131nda Mesajlar\u0131 Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> En iyi y\u00f6ntemlerden biri, \u00fcretim ortam\u0131nda (production environment) debug ve hatta info seviyesindeki konsol mesajlar\u0131n\u0131 tamamen kapatmakt\u0131r. Bunu hem sunucu taraf\u0131nda (\u00f6rne\u011fin, <code>AppSettings.json<\/code> dosyas\u0131nda bir bayrak veya <code>IWebHostEnvironment.IsDevelopment()<\/code> kontrol\u00fc kullanarak) hem de istemci taraf\u0131nda (JavaScript kodunuzda <code>if (window.APP_ENV === &#039;development&#039;)<\/code> gibi bir kontrolle) yapabilirsiniz.<\/li>\n<li><strong>Veri Maskeleme ve Anonimle\u015ftirme:<\/strong> E\u011fer hassas verilerin bir k\u0131sm\u0131n\u0131 g\u00f6stermek zorundaysan\u0131z, bunlar\u0131 maskeleyin (\u00f6rne\u011fin, kart numaralar\u0131n\u0131n son 4 hanesini g\u00f6sterme) veya anonimle\u015ftirin.<\/li>\n<li><strong>Yetkilendirme ve Rol Bazl\u0131 Eri\u015fim:<\/strong> Konsol mesajlar\u0131n\u0131n g\u00f6sterilmesini belirli kullan\u0131c\u0131 rollerine veya geli\u015ftirici moduna ba\u011fl\u0131 hale getirebilirsiniz. Bu, sadece yetkili ki\u015filerin bu mesajlar\u0131 g\u00f6rmesini sa\u011flar.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Global bir JavaScript logger fonksiyonu olu\u015fturarak t\u00fcm <code>console.log<\/code> \u00e7a\u011fr\u0131lar\u0131n\u0131z\u0131 bu fonksiyon \u00fczerinden y\u00f6nlendirin. B\u00f6ylece, tek bir noktadan t\u00fcm konsol \u00e7\u0131kt\u0131lar\u0131n\u0131 kontrol edebilir ve \u00fcretim ortam\u0131nda kolayca devre d\u0131\u015f\u0131 b\u0131rakabilir veya farkl\u0131 loglama hizmetlerine y\u00f6nlendirebilirsiniz. \u00d6rne\u011fin: <\/p>\n<pre><code><script>\n    \/\/ Sunucudan veya yap\u0131land\u0131rmadan gelen bir de\u011fi\u015fkenle ortam\u0131 belirle\n    window.APP_ENV = 'development'; \/\/ 'production' olarak de\u011fi\u015febilir\n\n    function customLog(message, type = 'log') {\n        if (window.APP_ENV === 'development') { \n            \/\/ Sadece geli\u015ftirme ortam\u0131nda konsola yaz\n            if (console[type]) {\n                console[type](message);\n            } else {\n                console.log(message); \/\/ Desteklenmeyen tipler i\u00e7in varsay\u0131lan\n            }\n        }\n        \/\/ \u00dcretimde loglar\u0131 farkl\u0131 bir yere (\u00f6rne\u011fin, sunucuya) g\u00f6nderme mant\u0131\u011f\u0131 eklenebilir\n    }\n    \/\/ Kullan\u0131m: customLog(\"Bu sadece geli\u015ftirme ortam\u0131nda g\u00f6r\u00fcn\u00fcr\", \"warn\");\n<\/script><\/pre>\n<p><\/code>\n<\/div>\n<h3>Performans Optimizasyonu<\/h3>\n<p>\u00c7ok s\u0131k veya \u00e7ok b\u00fcy\u00fck boyutlu mesajlar\u0131 konsola g\u00f6ndermek, taray\u0131c\u0131n\u0131n performans\u0131n\u0131 olumsuz etkileyebilir. \u00d6zellikle yo\u011fun veri ak\u0131\u015f\u0131 olan ger\u00e7ek zamanl\u0131 uygulamalarda bu durum daha belirgin hale gelebilir ve hatta taray\u0131c\u0131y\u0131 yava\u015flatabilir. A\u015fa\u011f\u0131daki y\u00f6ntemlerle performans sorunlar\u0131n\u0131 \u00f6nleyebilirsiniz:<\/p>\n<ul>\n<li><strong>Gereksiz Mesajlardan Ka\u00e7\u0131nma:<\/strong> Sadece ger\u00e7ekten gerekli olan bilgileri g\u00f6nderin. Her milisaniyede bir durum g\u00fcncellemesi g\u00f6ndermek yerine, sadece \u00f6nemli de\u011fi\u015fiklikler oldu\u011funda veya belirli, daha seyrek aral\u0131klarla g\u00fcncellemeler g\u00f6nderin.<\/li>\n<li><strong>Veri Boyutunu K\u00fc\u00e7\u00fcltme:<\/strong> JSON nesnelerini m\u00fcmk\u00fcn oldu\u011funca k\u00fc\u00e7\u00fck tutun. Sadece gerekli alanlar\u0131 g\u00f6nderin ve gereksiz metadata'dan ka\u00e7\u0131n\u0131n. Bu, a\u011f trafi\u011fini de azalt\u0131r.<\/li>\n<li><strong>Debouncing ve Throttling (\u0130stemci Taraf\u0131nda):<\/strong> E\u011fer istemci taraf\u0131nda belirli bir olaya yan\u0131t olarak s\u00fcrekli mesajlar g\u00f6ndermeniz gerekiyorsa (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n arama kutusuna yaz\u0131 yazmas\u0131), bu teknikler ile fonksiyon \u00e7a\u011fr\u0131 s\u0131kl\u0131\u011f\u0131n\u0131 s\u0131n\u0131rlayarak hem istemci performans\u0131n\u0131 hem de sunucuya binen y\u00fck\u00fc azaltabilirsiniz.<\/li>\n<li><strong>Debug Modu Kontrol\u00fc:<\/strong> Sunucunuzun sadece debug modunda \u00e7al\u0131\u015f\u0131rken konsol mesajlar\u0131 g\u00f6ndermesini sa\u011flay\u0131n. ASP.NET Core'da <code>app.Environment.IsDevelopment()<\/code> gibi y\u00f6ntemler, bu kontrol\u00fc kodunuzda kolayca uygulaman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Mobil Uyumluluk ve Geli\u015ftirici Ara\u00e7lar\u0131<\/h3>\n<p>Mobil cihazlarda hata ay\u0131klama, masa\u00fcst\u00fc taray\u0131c\u0131lara g\u00f6re baz\u0131 farkl\u0131l\u0131klar g\u00f6sterse de, modern mobil taray\u0131c\u0131lar da genellikle konsol \u00e7\u0131kt\u0131lar\u0131n\u0131 destekler. iOS i\u00e7in Safari'nin geli\u015ftirici ara\u00e7lar\u0131 (Mac \u00fczerinde), Android i\u00e7in Chrome'un uzaktan hata ay\u0131klama (remote debugging) \u00f6zelli\u011fi veya taray\u0131c\u0131 tabanl\u0131 baz\u0131 eklentiler mobil cihazlarda konsol mesajlar\u0131n\u0131 izlemenize olanak tan\u0131r. Sunucudan gelen konsol mesajlar\u0131, bu mobil geli\u015ftirici ara\u00e7lar\u0131nda da ayn\u0131 \u015fekilde g\u00f6r\u00fcnt\u00fclenecektir. Bu, mobil cihazlara \u00f6zel hatalar\u0131 ay\u0131klarken son derece de\u011ferlidir ve kullan\u0131c\u0131 deneyiminin farkl\u0131 cihazlarda sorunsuz olmas\u0131n\u0131 sa\u011flamak i\u00e7in gereklidir.<\/p>\n<p>Makalenin ba\u015f\u0131nda yer alan CSS medya sorgusu \u00f6rnekleri, bir web sayfas\u0131n\u0131n farkl\u0131 ekran boyutlar\u0131na nas\u0131l uyum sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6sterir. Bu, sunucudan konsola mesaj g\u00f6nderme tekniklerinin kullan\u0131ld\u0131\u011f\u0131 aray\u00fczlerin de mobil dostu olabilece\u011fini vurgular ve geli\u015ftiricilerin, kodlar\u0131n\u0131 farkl\u0131 cihazlarda test ederken konsol mesajlar\u0131n\u0131 aktif olarak kullanmalar\u0131 gerekti\u011fini hat\u0131rlat\u0131r.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck Bir E-Ticaret Uygulamas\u0131nda Sunucu Mesajlar\u0131n\u0131n Rol\u00fc Nedir?<\/h2>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli bir e-ticaret platformunun karma\u015f\u0131k yap\u0131s\u0131n\u0131 ele alal\u0131m; kullan\u0131c\u0131lar\u0131n \u00fcr\u00fcnleri g\u00f6r\u00fcnt\u00fcledi\u011fi, sepete ekledi\u011fi, sipari\u015f verdi\u011fi, \u00f6deme yapt\u0131\u011f\u0131 ve sipari\u015flerini takip etti\u011fi bir sistem. Bu t\u00fcr bir uygulamada, sunucu taraf\u0131nda stok y\u00f6netimi, \u00f6deme ge\u00e7idi entegrasyonlar\u0131, indirim ve kupon kontrolleri, kargo entegrasyonlar\u0131, kullan\u0131c\u0131 bildirimleri ve daha bir\u00e7ok kritik i\u015flem asenkron olarak ger\u00e7ekle\u015fir. Bu s\u00fcre\u00e7lerde meydana gelen herhangi bir hata veya uyar\u0131, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyebilir ve geli\u015ftiriciler i\u00e7in tespit edilmesi zor sorunlara yol a\u00e7abilir. Bu senaryo, sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6ndermenin ne kadar de\u011ferli olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h3>Senaryo: Sepete \u00dcr\u00fcn Ekleme ve Stok Kontrol\u00fc<\/h3>\n<p>Bir kullan\u0131c\u0131 bir \u00fcr\u00fcn\u00fc sepete ekledi\u011finde, arka planda \u015fu ad\u0131mlar ger\u00e7ekle\u015febilir:<\/p>\n<ol>\n<li>\u0130stemci, sunucuya \u00fcr\u00fcn ekleme iste\u011fi g\u00f6nderir (\u00fcr\u00fcn ID'si ve miktar\u0131yla).<\/li>\n<li>Sunucu, veritaban\u0131ndan \u00fcr\u00fcn\u00fcn g\u00fcncel stok durumunu kontrol eder.<\/li>\n<li>E\u011fer stok yetersizse, bir hata d\u00f6ner.<\/li>\n<li>E\u011fer stok yeterliyse, \u00fcr\u00fcn\u00fc kullan\u0131c\u0131n\u0131n sepetine ekler ve stok miktar\u0131n\u0131 g\u00fcnceller.<\/li>\n<li>Gerekirse, ilgili \u00fcr\u00fcn\u00fcn stok seviyesinin belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcne dair bir bildirim (\u00f6rne\u011fin, y\u00f6netici paneli i\u00e7in veya konsola) olu\u015fturur.<\/li>\n<\/ol>\n<h3>Problem: Geli\u015ftirme ve Canl\u0131 Ortamda Hata Ay\u0131klama Zorluklar\u0131<\/h3>\n<p>Yukar\u0131daki senaryoda, \u00f6zellikle yo\u011fun anlarda veya harici entegrasyonlarla ilgili sorunlarda beklenmedik problemler ya\u015fanabilir. \u00d6rne\u011fin, stok g\u00fcncellemesi s\u0131ras\u0131nda bir veritaban\u0131 ba\u011flant\u0131 hatas\u0131 olu\u015fursa veya \u00f6deme ge\u00e7idi API'si bir sorun d\u00f6nerse, kullan\u0131c\u0131ya genellikle genel bir hata mesaj\u0131 g\u00f6sterilir (\"Sepete eklenemedi\" veya \"\u00d6deme ba\u015far\u0131s\u0131z\"). Bu durumda geli\u015ftirici, tam olarak neyin yanl\u0131\u015f gitti\u011fini anlamakta zorlanabilir. Canl\u0131 ortamda, kullan\u0131c\u0131lar\u0131n bildirdi\u011fi sorunlar\u0131 h\u0131zl\u0131ca anlamak ve d\u00fczeltmek i\u00e7in sadece sunucu loglar\u0131na bakmak zaman al\u0131c\u0131 ve karma\u015f\u0131k olabilir. Bu da m\u00fc\u015fteri memnuniyetsizli\u011fine ve gelir kayb\u0131na yol a\u00e7abilir.<\/p>\n<h3>\u00c7\u00f6z\u00fcm: SignalR ile Ger\u00e7ek Zamanl\u0131 Sunucu Konsol Mesajlar\u0131<\/h3>\n<p>Bu e-ticaret uygulamas\u0131nda, sunucudan taray\u0131c\u0131 konsoluna ger\u00e7ek zamanl\u0131 mesajlar g\u00f6ndermek i\u00e7in SignalR kullan\u0131labilir. Her kritik ad\u0131mda veya hata durumunda, ilgili bilgiler istemci konsoluna iletilir. Bu sayede, geli\u015ftiriciler anl\u0131k geri bildirim alarak sorunlar\u0131 daha h\u0131zl\u0131 te\u015fhis edebilir. \u00d6rnek bir sunucu taraf\u0131 kod pasaj\u0131:<\/p>\n<pre><code>\n\/\/ Sunucu Taraf\u0131 (\u00d6rnek - Controller veya Servis i\u00e7inde)\npublic async Task<IActionResult> AddProductToCart(int productId, int quantity, int userId)\n{\n    \/\/ ... \u00fcr\u00fcn ve kullan\u0131c\u0131 do\u011frulama kodlar\u0131 ...\n\n    \/\/ \u00dcr\u00fcn stok kontrol\u00fc\n    var stock = _productService.GetProductStock(productId);\n    if (stock < quantity)\n    {\n        \/\/ Stok yetersizse konsola uyar\u0131 mesaj\u0131 g\u00f6nder\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"E-Ticaret\", \n            $\"Kullan\u0131c\u0131 {userId} i\u00e7in \u00fcr\u00fcn {productId} stok yetersiz! Talep: {quantity}, Mevcut: {stock}\", \"warn\");\n        return BadRequest(\"\u00dcr\u00fcn stokta yeterli miktarda bulunmamaktad\u0131r.\");\n    }\n\n    try\n    {\n        _cartService.AddToCart(userId, productId, quantity);\n        \/\/ \u00dcr\u00fcn sepete ba\u015far\u0131yla eklendi\u011finde konsola bilgi mesaj\u0131 g\u00f6nder\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"E-Ticaret\", \n            $\"Kullan\u0131c\u0131 {userId} \u00fcr\u00fcn\u00fc {productId} sepete ekledi. Yeni stok: {stock - quantity}.\", \"info\");\n\n        \/\/ Stok belirli bir kritik e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde hata mesaj\u0131 ile uyar\u0131 g\u00f6nder\n        if (stock - quantity < 10) \/\/ \u00d6rne\u011fin 10 \u00fcr\u00fcn e\u015fik de\u011feri\n        {\n            await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"E-Ticaret\", \n                $\"D\u0130KKAT: \u00dcr\u00fcn {productId} i\u00e7in stok kritik seviyede: {stock - quantity} adet kald\u0131!\", \"error\");\n        }\n    }\n    catch (Exception ex)\n    {\n        \/\/ Sepete ekleme s\u0131ras\u0131nda bir hata olu\u015fursa konsola hata mesaj\u0131 g\u00f6nder\n        await _hubContext.Clients.All.SendAsync(\"ReceiveConsoleMessage\", \"E-Ticaret\", \n            $\"Sepete eklerken hata olu\u015ftu: {ex.Message} (\u00dcr\u00fcn ID: {productId}, Kullan\u0131c\u0131 ID: {userId})\", \"error\");\n        return StatusCode(500, \"\u00dcr\u00fcn sepete eklenirken bir sunucu hatas\u0131 olu\u015ftu.\");\n    }\n    return Ok(\"\u00dcr\u00fcn ba\u015far\u0131yla sepete eklendi.\");\n}\n``<code><\/pre>\n<p>\u0130stemci taraf\u0131nda ise, daha \u00f6nce g\u00f6sterilen SignalR JavaScript kodu, bu mesajlar\u0131 al\u0131p taray\u0131c\u0131 konsolunda uygun seviyelerde (info, warn, error) g\u00f6r\u00fcnt\u00fcler. Geli\u015ftiriciler, bir kullan\u0131c\u0131 \"\u00dcr\u00fcn sepete eklenemedi\" gibi bir hata ald\u0131\u011f\u0131nda, taray\u0131c\u0131 konsolunu a\u00e7arak an\u0131nda \"\u00dcr\u00fcn X i\u00e7in stok yetersiz!\" veya \"Sepete eklerken veritaban\u0131 ba\u011flant\u0131 hatas\u0131 olu\u015ftu\" gibi detayl\u0131 ve anla\u015f\u0131l\u0131r mesajlar\u0131 g\u00f6rebilirler. Bu anl\u0131k geri bildirim, sorunun kayna\u011f\u0131n\u0131 belirleme ve \u00e7\u00f6zme s\u00fcresini dramatik bir \u015fekilde azalt\u0131r, b\u00f6ylece geli\u015ftiricilerin verimlili\u011fini art\u0131r\u0131r.<\/p>\n<h3>Faydalar\u0131:<\/h3>\n<ul>\n<li><strong>H\u0131zl\u0131 Hata Tespiti:<\/strong> Canl\u0131 sistemlerde anl\u0131k sorunlar\u0131 tespit etme ve debug etme yetene\u011fi sa\u011flar.<\/li>\n<li><strong>Geli\u015fmi\u015f Geli\u015ftirici Deneyimi:<\/strong> Geli\u015ftiricilerin arka plandaki i\u015f ak\u0131\u015f\u0131n\u0131 ve durumlar\u0131n\u0131 daha iyi anlamas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Kesintisiz Kullan\u0131c\u0131 Deneyimi:<\/strong> Son kullan\u0131c\u0131ya teknik hata mesajlar\u0131 g\u00f6stermeden, geli\u015ftiricilerin sorunlar\u0131 \u00e7\u00f6zmesine olanak tan\u0131r.<\/li>\n<li><strong>Ger\u00e7ek Zamanl\u0131 \u0130zleme:<\/strong> Yava\u015f \u00e7al\u0131\u015fan API \u00e7a\u011fr\u0131lar\u0131, sistem a\u015f\u0131r\u0131 y\u00fcklenmeleri veya entegrasyon sorunlar\u0131 gibi performans problemlerini an\u0131nda g\u00f6zlemleme imkan\u0131 sunar.<\/li>\n<li><strong>Daha Az Kesinti:<\/strong> Sorunlar b\u00fcy\u00fcmeden, olu\u015fur olu\u015fmaz m\u00fcdahale etme yetene\u011fi, uygulaman\u0131n genel kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu vaka analizi, sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6ndermenin sadece geli\u015ftirme a\u015famas\u0131nda de\u011fil, ayn\u0131 zamanda canl\u0131 sistemlerin izlenmesinde ve sorun giderme s\u00fcre\u00e7lerinde ne kadar kritik bir ara\u00e7 olabilece\u011fini a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r. \u00d6zellikle SignalR gibi ger\u00e7ek zamanl\u0131 teknolojilerle birle\u015fti\u011finde, bu yakla\u015f\u0131m modern web uygulamalar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131yla ba\u015fa \u00e7\u0131kmak i\u00e7in vazge\u00e7ilmez bir strateji haline gelir ve geli\u015ftirici verimlili\u011fini maksimize eder.<\/p>\n<h2>Sonu\u00e7: Web Geli\u015ftirme S\u00fcre\u00e7lerinizi G\u00fc\u00e7lendirin<\/h2>\n<p>ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6nderme yetene\u011fi, modern web geli\u015ftiricileri i\u00e7in art\u0131k vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bu makale boyunca, bu ileti\u015fimin neden bu kadar \u00f6nemli oldu\u011funu, temel kavramlar\u0131n\u0131 ve AJAX\/JSON ile SignalR kullanarak ad\u0131m ad\u0131m nas\u0131l uyguland\u0131\u011f\u0131n\u0131 detayl\u0131 kod \u00f6rnekleriyle derinlemesine inceledik. Ayr\u0131ca, ileri d\u00fczey ipu\u00e7lar\u0131, g\u00fcvenlik endi\u015feleri ve performans optimizasyonlar\u0131na de\u011finerek, bu teknikleri en verimli \u015fekilde nas\u0131l kullanabilece\u011finizi g\u00f6sterdik. E-ticaret uygulamas\u0131 gibi ger\u00e7ek d\u00fcnya senaryolar\u0131nda ger\u00e7ekle\u015ftirdi\u011fimiz vaka analizi ile, bu y\u00f6ntemlerin pratik faydalar\u0131n\u0131 somutla\u015ft\u0131rd\u0131k ve uygulama geli\u015ftirme s\u00fcre\u00e7lerindeki kritik rol\u00fcn\u00fc vurgulad\u0131k.<\/p>\n<p>\u0130ster h\u0131zl\u0131 bir hata ay\u0131klama mesaj\u0131na ihtiyac\u0131n\u0131z olsun, ister arka planda uzun s\u00fcren bir i\u015flemin anl\u0131k durumunu kesintisiz bir \u015fekilde izlemek isteyin, sunucudan taray\u0131c\u0131 konsoluna mesaj g\u00f6ndermek size \u00f6nemli \u00f6l\u00e7\u00fcde zaman kazand\u0131racak ve geli\u015ftirme s\u00fcrecinizi \u00e7ok daha verimli hale getirecektir. G\u00fcvenlik ve performans en iyi uygulamalar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak bu teknikleri projelerinize entegre etti\u011finizde, uygulaman\u0131z\u0131n kalitesini art\u0131rabilir ve sorun giderme s\u00fcre\u00e7lerinizi \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131rabilirsiniz. Unutmay\u0131n, modern web geli\u015ftirmenin karma\u015f\u0131kl\u0131\u011f\u0131 kar\u015f\u0131s\u0131nda, eldeki t\u00fcm ara\u00e7lar\u0131 etkin ve ak\u0131ll\u0131ca kullanabilen geli\u015ftiriciler her zaman bir ad\u0131m \u00f6nde olacakt\u0131r. Bu teknikler, size uygulaman\u0131z\u0131n kalbine bir pencere a\u00e7arak, kontrol\u00fc elinizde tutman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>S1: \"WebForms Core 2\" tam olarak nedir ve neden bu makalede ASP.NET Core kullan\u0131ld\u0131?<\/strong><\/p>\n<p>C1: \"WebForms Core 2\" terimi, Microsoft&#039;un mevcut .NET ekosisteminde standart veya resmi bir adland\u0131rma de\u011fildir. WebForms, ASP.NET&#039;in daha eski, olay tabanl\u0131 bir modelidir. .NET Core (\u015fimdiki ad\u0131yla sadece .NET), WebForms&#039;un yerini alan ve modern web geli\u015ftirme i\u00e7in tasarlanm\u0131\u015f, \u00e7apraz platform bir \u00e7er\u00e7evedir. Bu makalede, \"WebForms Core 2\" teriminin modern bir ASP.NET ba\u011flam\u0131nda sunucudan istemciye mesaj g\u00f6nderme ihtiyac\u0131n\u0131 ifade etti\u011fi varsay\u0131larak, g\u00fcncel ve modern ASP.NET Core teknikleri kullan\u0131lm\u0131\u015ft\u0131r. Bu yakla\u015f\u0131m, WebForms&#039;un sundu\u011fu kolayl\u0131klar\u0131 modern .NET platformunun g\u00fcc\u00fcyle birle\u015ftirme aray\u0131\u015f\u0131na en uygun ve performansl\u0131 \u00e7\u00f6z\u00fcmleri sunmaktad\u0131r.<\/p>\n<p><strong>S2: Sunucudan konsola mesaj g\u00f6ndermek g\u00fcvenlik riski ta\u015f\u0131r m\u0131?<\/strong><\/p>\n<p>C2: Evet, potansiyel olarak ta\u015f\u0131r. E\u011fer kimlik bilgileri, API anahtarlar\u0131, veritaban\u0131 ba\u011flant\u0131 dizeleri veya ki\u015fisel kullan\u0131c\u0131 verileri gibi hassas bilgiler do\u011frudan konsola loglan\u0131rsa, bu bilgiler taray\u0131c\u0131daki geli\u015ftirici ara\u00e7lar\u0131n\u0131 a\u00e7an herkes taraf\u0131ndan g\u00f6r\u00fclebilir hale gelir. Bu nedenle, \u00fcretim ortam\u0131nda bu t\u00fcr mesajlar\u0131n ya tamamen kapat\u0131lmas\u0131 ya da sadece \u00e7ok genel ve zarars\u0131z bilgileri i\u00e7ermesi kritik \u00f6neme sahiptir. Geli\u015ftirme veya test ortamlar\u0131nda dahi, hassas bilgilerin maskelenmesi veya k\u0131salt\u0131lmas\u0131 \u00f6nerilir.<\/p>\n<p><strong>S3: Her zaman SignalR kullanmak zorunda m\u0131y\u0131m, yoksa AJAX yeterli mi?<\/strong><\/p>\n<p>C3: Hay\u0131r, her zaman SignalR kullanmak zorunda de\u011filsiniz. Hangi y\u00f6ntemin projenize daha uygun oldu\u011fu, uygulaman\u0131z\u0131n gereksinimlerine ba\u011fl\u0131d\u0131r. E\u011fer sunucudan istemciye sadece belirli bir iste\u011fe yan\u0131t olarak veya tek seferlik mesajlar g\u00f6ndermeniz gerekiyorsa, AJAX ve JSON genellikle daha basit ve yeterli bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, ger\u00e7ek zamanl\u0131, \u00e7ift y\u00f6nl\u00fc ileti\u015fim, anl\u0131k bildirimler, canl\u0131 g\u00fcncellemeler veya sunucunun istedi\u011fi zaman istemciye veri g\u00f6ndermesi gereken senaryolarda SignalR \u00e7ok daha uygun ve performansl\u0131 bir se\u00e7enektir.<\/p>\n<p><strong>S4: \u00dcretim ortam\u0131nda konsol mesajlar\u0131n\u0131 nas\u0131l kapat\u0131r\u0131m?<\/strong><\/p>\n<p>C4: \u00dcretim ortam\u0131nda konsol mesajlar\u0131n\u0131 kapatman\u0131n veya k\u0131s\u0131tlaman\u0131n birka\u00e7 etkili yolu vard\u0131r:<\/p>\n<ol>\n<li><strong>Sunucu Taraf\u0131 Kontrol\u00fc:<\/strong> ASP.NET Core&#039;da<\/code>IWebHostEnvironment.IsDevelopment()<code>gibi y\u00f6ntemleri kullanarak, sadece geli\u015ftirme ortam\u0131ndayken SignalR veya AJAX ile konsol mesaj\u0131 g\u00f6nderme kodunu tetikleyebilirsiniz.<\/li>\n<li><strong>\u0130stemci Taraf\u0131 Kontrol\u00fc:<\/strong> JavaScript kodunuzda global bir de\u011fi\u015fken (<\/code>window.APP_ENV = 'production';<code>) veya bir \u00f6zellik kontrol\u00fc (<\/code>if (window.location.hostname !== 'localhost')<code>) kullanarak<\/code>console.log<code>\u00e7a\u011fr\u0131lar\u0131n\u0131 ko\u015fullu hale getirebilirsiniz. Makalede bahsedilen<\/code>customLog<code>fonksiyonu, bu konuda size b\u00fcy\u00fck kolayl\u0131k sa\u011flayacakt\u0131r.<\/li>\n<li><strong>Otomatik Kald\u0131rma:<\/strong> \u00dcretim i\u00e7in JavaScript kodunu obf\u00fcske ederken veya minifiye ederken kullan\u0131lan baz\u0131 ara\u00e7lar,<\/code>console.log` \u00e7a\u011fr\u0131lar\u0131n\u0131 otomatik olarak kald\u0131rabilir veya belirli ko\u015fullara ba\u011flayabilir.<\/li>\n<\/ol>\n<p><strong>S5: Taray\u0131c\u0131 konsolu yerine sunucu loglar\u0131na bakmak daha m\u0131 iyi?<\/strong><\/p>\n<p>C5: Her iki y\u00f6ntem de farkl\u0131 ama\u00e7lara hizmet eder ve birbirini tamamlar. Sunucu loglar\u0131, uygulaman\u0131n arka plan\u0131ndaki t\u00fcm detayl\u0131 i\u015flemleri, hatalar\u0131, performans verilerini ve izleme bilgilerini kal\u0131c\u0131 olarak kaydeder; genellikle \u00fcretim ortam\u0131nda uzun s\u00fcreli izleme, denetim ve analitik i\u00e7in kullan\u0131l\u0131r. Taray\u0131c\u0131 konsolu ise, \u00f6zellikle istemci-sunucu etkile\u015fimlerindeki anl\u0131k sorunlar\u0131 tespit etmek, JavaScript hatalar\u0131n\u0131 ay\u0131klamak ve kullan\u0131c\u0131n\u0131n g\u00f6z\u00fcnden uygulaman\u0131n nas\u0131l davrand\u0131\u011f\u0131n\u0131 g\u00f6rmek i\u00e7in daha h\u0131zl\u0131 ve do\u011frudan bir ara\u00e7t\u0131r. Geli\u015ftirme ve hata ay\u0131klama s\u0131ras\u0131nda taray\u0131c\u0131 konsolu \u00e7ok de\u011ferlidir; \u00fcretimde ise g\u00fcvenlik ve detayl\u0131 izleme i\u00e7in genellikle sunucu loglar\u0131 tercih edilir, konsol mesajlar\u0131 ise minimum seviyeye indirilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda&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-34148","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: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.\" \/>\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-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-11T21:32:12+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=\"27 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-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme\",\"datePublished\":\"2025-11-11T21:32:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\"},\"wordCount\":4661,\"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-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\",\"name\":\"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-11T21:32:12+00:00\",\"description\":\"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme\"}]},{\"@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: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme","description":"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.","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-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/","og_locale":"tr_TR","og_type":"article","og_title":"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme","og_description":"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-11T21:32:12+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme","datePublished":"2025-11-11T21:32:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/"},"wordCount":4661,"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-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/","url":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/","name":"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-11T21:32:12+00:00","description":"Modern web uygulamalar\u0131, artan karma\u015f\u0131kl\u0131klar\u0131yla birlikte geli\u015ftirme ve hata ay\u0131klama s\u00fcre\u00e7lerinde yeni zorluklar ortaya koymaktad\u0131r. \u00d6zellikle arka planda \u00e7al\u0131\u015fan sunucu tabanl\u0131 i\u015flemlerin sonu\u00e7lar\u0131n\u0131, durumlar\u0131n\u0131 veya olas\u0131 hatalar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) kesintiye u\u011fratmadan do\u011frudan istemci taraf\u0131ndaki taray\u0131c\u0131 konsoluna aktarmak, geli\u015ftiriciler i\u00e7in kritik bir kolayl\u0131k sunar. Bu makale, ASP.NET Core uygulamalar\u0131nda sunucudan taray\u0131c\u0131 konsoluna nas\u0131l g\u00fcvenli ve etkin bir \u015fekilde mesaj g\u00f6nderilece\u011fini, ad\u0131m ad\u0131m ve pratik kod \u00f6rnekleriyle a\u00e7\u0131klayacakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n g\u00f6r\u00fcnmeyen y\u00fcz\u00fcndeki dinamikleri kolayca takip edebileceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/asp-net-core-sunucudan-tarayici-konsoluna-mesaj-gonderme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ASP.NET Core: Sunucudan Taray\u0131c\u0131 Konsoluna Mesaj G\u00f6nderme"}]},{"@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\/34148","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=34148"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34148\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}