﻿
{"id":26870,"date":"2024-01-28T20:22:13","date_gmt":"2024-01-28T20:22:13","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26870"},"modified":"2024-01-28T20:22:13","modified_gmt":"2024-01-28T20:22:13","slug":"net-8-short-circuit-routing","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-8-short-circuit-routing\/","title":{"rendered":".NET 8 | Short-Circuit Routing"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde .NET 8 ile Asp.NET Core&#8217;a gelen ve <em>short-circuit routing<\/em> olarak nitelendirilen k\u00fc\u00e7\u00fck bir yenili\u011fi inceliyor olacak, bu yenili\u011fin normal routing&#8217;den ne kadar farkl\u0131 oldu\u011funa ve hangi durumlarda kullan\u0131lmas\u0131 gerekti\u011fine dair isti\u015farede bulunuyor olaca\u011f\u0131z.<\/p>\n<p>\u015eimdi konuya direkt kitab\u0131n ortas\u0131ndan girersek e\u011fer; biliyorsunuz ki, Asp.NET Core&#8217;da bir istek geldi\u011fi taktirde bu iste\u011fe kar\u015f\u0131n hangi endpoint&#8217;in tetiklenece\u011fi <code>EndpointRoutingMiddleware<\/code> middleware&#8217;i ile kararla\u015ft\u0131r\u0131lmakta<span style=\"font-size:12px\">(ya da <code>RoutingMiddleware<\/code>&#8216;de denmektedir)<\/span>, kararla\u015ft\u0131r\u0131lan endpoint <code>EndpointMiddleware<\/code> middleware&#8217;i ile \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r.<\/p>\n<p>.NET geli\u015ftiricileri bu iki durumu farkl\u0131 middleware&#8217;ler ile ay\u0131rarak, belki \u00e7al\u0131\u015fma s\u00fcrecinde her iki middleware aras\u0131nda bir ba\u015fka middleware&#8217;i<span style=\"font-size:12px\">(ya da middleware&#8217;leri)<\/span> daha \u00e7al\u0131\u015ft\u0131rabilme avantaj\u0131ndan istifade edebilme imkan\u0131n\u0131 bizlere tan\u0131maktad\u0131rlar. Mesela, iste\u011fin geldi\u011fi endpoint&#8217;e dair metadata&#8217;lara dayal\u0131 olarak davran\u0131\u015f de\u011fi\u015ftirmek istiyorsak e\u011fer bu i\u015fi \u00fcstlenecek bir middleware olu\u015fturabilir ve \u00e7al\u0131\u015fmalar\u0131m\u0131z\u0131 y\u00fcr\u00fctebiliriz. Ki bizler genellikle ne yap\u0131yoruz? En yayg\u0131n \u00f6rnek olarak, iste\u011fin geldi\u011fi endpoint&#8217;e eri\u015fim yetkisinin olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilmek i\u00e7in authentication ve authorization middleware&#8217;lerini \u00e7a\u011f\u0131r\u0131yoruz. B\u00f6ylece bu kontroller neticesinde ilgili endpoint&#8217;in \u00e7al\u0131\u015ft\u0131r\u0131l\u0131p, \u00e7al\u0131\u015ft\u0131r\u0131lmayaca\u011f\u0131n\u0131n karar\u0131n\u0131 veriyoruz! \u00d6yle de\u011fil mi? \u00d6zellikle API<span style=\"font-size:12px;\">(ya da Minimal API)<\/span> ve MVC uygulamalar\u0131nda, controller&#8217;lara yap\u0131lan isteklerde bu \u015fekilde \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftiriyoruz.<\/p>\n<p>Evet, duruma g\u00f6re bu \u015fekilde davran\u0131\u015f ger\u00e7ekle\u015ftiriyoruz ger\u00e7ekle\u015ftirmesine lakin yaz\u0131l\u0131m halidir ki kimi durumlarda da zerre kadar bir ara i\u015fleme ihtiya\u00e7 duymadan istekleri kar\u015f\u0131lam\u0131yor da de\u011filiz! \u00d6yle endpoint&#8217;ler olabiliyor ki bunlara gelen istek s\u00fcre\u00e7lerinde ne bir yetkilendirme kontrol\u00fc, ne CORS deste\u011fi yahut ne de farkl\u0131 bir i\u015fleme gereksinim duyulmaks\u0131z\u0131n direkt \u00e7al\u0131\u015ft\u0131rma odakl\u0131 s\u00fcre\u00e7 s\u00f6z konusu olabiliyor. \u0130\u015fte bu tarz endpoint&#8217;lerin kullan\u0131ld\u0131\u011f\u0131 istek s\u00fcre\u00e7lerinde, iste\u011fin i\u015flenmesini l\u00fczumsuz yere <code>EndpointRoutingMiddleware<\/code> ve <code>EndpointMiddleware<\/code> middleware s\u00fcre\u00e7lerine b\u00f6lmektense k\u0131ssadan hisse yaparak bu davran\u0131\u015flar\u0131 k\u00fcm\u00fclatif bir \u015fekilde tek seferde yapmaya odaklanmak isteyebiliriz. \u0130\u015ftee .NET 8 ile gelmi\u015f olan short-circuit routing davran\u0131\u015f\u0131n\u0131n devreye girece\u011fi yer tam da buras\u0131d\u0131r diyebiliriz.<\/p>\n<h3>Short-Circuit Routing Nedir?<\/h3>\n<p>\u0130\u00e7eri\u011fimizin ilk sat\u0131rlar\u0131ndan beri bahsedildi\u011fi \u00fczere .NET 8 ile gelmi\u015f olan yeni bir \u00f6zelliktir. Asp.NET Core uygulamas\u0131ndaki kimi endpoint&#8217;lere uygulanarak gelen isteklere kar\u015f\u0131n <code>EndpointRoutingMiddleware<\/code> ile <code>EndpointMiddleware<\/code> aras\u0131ndaki middleware&#8217;lerin atlat\u0131larak hedef endpoint&#8217;in direkt olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>Bunun i\u00e7in Minimal API&#8217;ler de a\u015fa\u011f\u0131daki gibi <code>ShortCircuit<\/code> metodunu kullanabilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;Merhaba d\u00fcnya&quot;)\r\n    .ShortCircuit();\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar basit! Bu \u015fekilde kullan\u0131lan bir endpoint h\u0131zl\u0131ca ara katmanlara temas etmeksizin direkt \u00e7al\u0131\u015ft\u0131r\u0131l\u0131p, sonu\u00e7 d\u00f6nd\u00fcr\u00fcyor olacakt\u0131r.<\/p>\n<p><strong>Peki, o halde short-circuit routing&#8217;i ne zaman kullanmal\u0131y\u0131z?<\/strong><\/p>\n<p>Tabi ki de ihtiya\u00e7 noktalar\u0131nda \ud83d\ude42 Yani mikro seviyede performans optimizasyonunun \u00f6nemsendi\u011fi uygulamalarda endpoint&#8217;lere gelen istek s\u00fcre\u00e7lerinde gereksiz bir \u015fekilde middleware&#8217;lerin tetiklendi\u011fi durumlar varsa e\u011fer o endpoint&#8217;leri short-circuit routing ile aya\u011fa kald\u0131rabilirsiniz. Bunlar\u0131n d\u0131\u015f\u0131nda; Google gibi arama motorlar\u0131n\u0131n kulland\u0131\u011f\u0131 <em>\/robots.txt<\/em> gibi dosyalar\u0131 tarif eden endpoint&#8217;lerde, <em>\/favicon.ico<\/em> gibi taray\u0131c\u0131 taraf\u0131ndan otomatik olarak talep edilen adreslerde ve OpenID Connect gibi protokollerin kulland\u0131\u011f\u0131 <em>\/.well-known\/*<\/em> vs. gibi adreslemelerde short-circuit routing bi\u00e7ilmi\u015f kaftan olacakt\u0131r diyebiliriz.<\/p>\n<h3>MapShortCircuit Metodu<\/h3>\n<p>Bu metot ile uygulamaya gelecek olan iste\u011fin, belli bir ifadeyle ba\u015flay\u0131p ba\u015flamad\u0131\u011f\u0131n\u0131 kontrol edebilir ve direkt olarak k\u0131sa devre yap\u0131p status code&#8217;u e\u015fli\u011finde iste\u011fi bo\u015fa \u00e7\u0131karabilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapShortCircuit((int)HttpStatusCode.NotFound, &quot;admin&quot;);\r\n<\/pre>\n<\/div>\n<p>Misal olarak yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;admin&#8217; ile ba\u015flayan bir iste\u011fin status code&#8217;unu direkt olarak <em>NotFount(404)<\/em> \u015feklinde ayarlayacak ve geriye d\u00f6nd\u00fcr\u00fcyor olacakt\u0131r.<\/p>\n<p>Velhas\u0131l kelam&#8230; B\u00f6ylece .NET 8 ile gelmi\u015f olan yeni bir \u00f6zelli\u011fi daha incelemi\u015f bulunuyoruz. Burada konuya dair unutulmamas\u0131 gereken nokta \u015fudur ki <em>short-circuit routing<\/em>&#8216;in devrede oldu\u011fu endpoint&#8217;lere bir istek geldi\u011fi taktirde bu <code>EndpointRoutingMiddleware<\/code> yerine direkt olarak <code>EndpointMiddleware<\/code> middleware&#8217;inde y\u00fcr\u00fct\u00fcl\u00fcyor olacakt\u0131r. Ee haliyle b\u00f6yle bir \u00f6zelli\u011fin ihtiya\u00e7 noktalar\u0131nda kullan\u0131lmas\u0131 performans ve maliyet a\u00e7\u0131s\u0131ndan olduk\u00e7a avantaj sa\u011flayacakt\u0131r diye d\u00fc\u015f\u00fcn\u00fcyorum&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde .NET 8 ile Asp.NET Core&#8217;a gelen ve short-circuit routing olarak nitelendirilen k\u00fc\u00e7\u00fck bir yenili\u011fi inceliyor olacak, bu yenili\u011fin normal routing&#8217;den ne kadar farkl\u0131 oldu\u011funa ve hangi durumlarda kullan\u0131lmas\u0131 gerekti\u011fine dair isti\u015farede&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":26539,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4912,4997],"tags":[4915,4999,5010],"class_list":["post-26870","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-8","category-asp-net-core-8","tag-net-8","tag-asp-net-core-8","tag-short-circuit-routing"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=26870"}],"version-history":[{"count":4,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26870\/revisions"}],"predecessor-version":[{"id":26874,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26870\/revisions\/26874"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/26539"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}