﻿
{"id":9671,"date":"2018-10-01T19:54:57","date_gmt":"2018-10-01T19:54:57","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=9671"},"modified":"2018-10-01T19:54:57","modified_gmt":"2018-10-01T19:54:57","slug":"asp-net-core-2de-middleware-yapisi-ve-kullanimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2de-middleware-yapisi-ve-kullanimi\/","title":{"rendered":"Asp.NET Core 2&#8217;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Web yaz\u0131l\u0131mlar\u0131, genellikle kullan\u0131c\u0131larla etkile\u015fim a\u00e7\u0131s\u0131ndan olduk\u00e7a yo\u011fun bir yap\u0131 arz etmektedirler. Kullan\u0131c\u0131lar web sitesinden bir istekte bulunabilmekte ve bu iste\u011fe kar\u015f\u0131l\u0131k server taraf\u0131ndan uygun cevaplar \u00fcretilip g\u00f6nderilmektedir. Ve t\u00fcm s\u00fcre\u00e7 bu \u015fekilde cereyan etmekte, teknoloji ve yap\u0131lar ne kadar yenilenip g\u00fc\u00e7lendirilsede t\u00fcm mesele bu esasta seyr etmektedir.<\/p>\n<p>Biz yaz\u0131l\u0131mc\u0131lar ise bu s\u00fcre\u00e7te bazen yap\u0131lan isteklere kar\u015f\u0131l\u0131k verilecek cevaplara m\u00fcdahale ederek varl\u0131\u011f\u0131m\u0131z\u0131 g\u00f6stermek yahut arada farkl\u0131 i\u015flemler ger\u00e7ekle\u015ftirerek s\u00fcrecin gidi\u015fat\u0131na farkl\u0131 y\u00f6n vermek isteyebiliriz. Do\u011fal olarak bu iste\u011fimize kar\u015f\u0131l\u0131k yaz\u0131l\u0131m d\u00fcnyas\u0131nda bir kavram bizlere e\u015flik edecek ve yap\u0131sal olarak belli kurallarla gayemiz do\u011frultusunda bizlere hizmet edecektir.<\/p>\n<p>\u0130\u015fte kullan\u0131c\u0131 iste\u011fi ile o iste\u011fe kar\u015f\u0131l\u0131k \u00fcretilen cevap aras\u0131na girmemizi ve bu noktada hert\u00fcrl\u00fc i\u015fi y\u00fcr\u00fctmemizi sa\u011flayacak olan bu kavram Middleware(Ara Katman) olarak adland\u0131r\u0131lmaktad\u0131r. Middleware yap\u0131lar\u0131 mant\u0131k olarak request ile response aras\u0131na girip i\u015flem yapmam\u0131z\u0131 sa\u011flamakla birlikte, birden fazla olma durumlar\u0131nda s\u0131ral\u0131 ad\u0131mlar e\u015fli\u011finde i\u015flenmekte ve son middleware i\u015flemide bitti\u011fi an ilgili response kullan\u0131c\u0131ya g\u00f6nderilip s\u00fcre\u00e7 sona erdirilmektedir.<\/p>\n<p><strong>Peki middleware nas\u0131l kullan\u0131l\u0131r?<\/strong> sorusuna kar\u015f\u0131l\u0131k genel bir cevap vermemiz gerekirse e\u011fer kullan\u0131lan programlama dilleri aras\u0131nda farkl\u0131l\u0131k g\u00f6stermekle birlikte, ayn\u0131 \u00e7at\u0131 alt\u0131nda bulunan birden fazla teknoloji aras\u0131nda bile kullan\u0131m fark\u0131 s\u00f6z konusu olabilmektedir. \u00d6rne\u011fin; Node.js mod\u00fcl\u00fc olan Express.js&#8217;de middleware yap\u0131s\u0131n\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131na dair <a href=\"http:\/\/www.gencayyildiz.com\/blog\/express-js-middlewareara-katman-nedir-nasil-kullanilir\/\" rel=\"noopener\" target=\"_blank\">Express.js \u2013 Middleware(Ara Katman) Nedir? Nas\u0131l Kullan\u0131l\u0131r?<\/a> ba\u015fl\u0131kl\u0131 makalemizi kaleme alm\u0131\u015ft\u0131k. Bu i\u00e7eri\u011fimizde ise Asp.NET Core 2 mimarisinde middleware yap\u0131lar\u0131n\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131na dair bir incelemede bulunaca\u011f\u0131m\u0131z i\u00e7in ara katman mant\u0131\u011f\u0131n\u0131n iki farkl\u0131 platform aras\u0131ndaki fark\u0131n\u0131 rahatl\u0131kla de\u011ferlendirebilirsiniz.<\/p>\n<p>\u015eimdi fazla uzatmadan Asp.NET Core 2 mimarisinde middleware yap\u0131s\u0131na ufaktan giri\u015f yapmaya ba\u015flayal\u0131m \ud83d\ude42<\/p>\n<h3>Asp.NET Core 2&#8217;de Middleware Yap\u0131s\u0131<\/h3>\n<p>Asp.NET Core 2&#8217;de middleware yap\u0131lar\u0131 projenin &#8220;Startup&#8221; s\u0131n\u0131f\u0131 i\u00e7erisindeki &#8220;Configure&#8221; isimli metot taraf\u0131ndan bar\u0131nd\u0131r\u0131lmaktad\u0131r. Bu metot, yap\u0131lan iste\u011fe kar\u015f\u0131l\u0131k verilecek cevaplara istinaden ara katman olarak \u00e7al\u0131\u015fmakta ve \u00f6ncelik olarak belli ba\u015fl\u0131 i\u015flemleri ger\u00e7ekle\u015ftirmektedir. Zaten \u015fu ana kadar Asp.NET Core projelerinde ilgili metot i\u00e7erisinde kulland\u0131\u011f\u0131m\u0131z \u00e7o\u011fu fonksiyon asl\u0131nda bir middleware g\u00f6revi g\u00f6ren yap\u0131lard\u0131.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseStaticFiles();\r\n            app.UseExceptionHandler(&quot;\/Error\/Index&quot;);\r\n            app.UseMvc(routes =&gt;\r\n            {\r\n                routes.MapRoute(\r\n                    name: &quot;Default&quot;,\r\n                    template: &quot;{controller=Home}\/{action=Index}\/{id?}&quot;\r\n                    );\r\n            });\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda oldu\u011fu gibi;<\/p>\n<ul>\n<li><strong><em>UseStaticFiles<\/em><\/strong>,<\/li>\n<li><strong><em>UseExceptionHandler<\/em><\/strong>,<\/li>\n<li><strong><em>UseDeveloperExceptionPage<\/em><\/strong> ve hatta<\/li>\n<li><strong><em>UseMvc<\/em><\/strong><\/li>\n<li>.vs .vs<\/li>\n<\/ul>\n<p>bir middleware yap\u0131s\u0131nda fonksiyonlard\u0131r. Evet&#8230; sonuncu olan &#8220;UseMvc&#8221; fonksiyonuda bir middleware&#8217;dir. \u0130lgin\u00e7tir ama \u00f6yledir. MVC; yap\u0131sal olarak sade ve sadece bir tasar\u0131m desenidir. Klasik Asp.NET MVC bu tasar\u0131m desenini \u00f6z\u00fcmseyerek mimariyle b\u00fct\u00fcnselle\u015ftirmi\u015ftir. Her ne kadar kullan\u0131\u015fl\u0131 ve harika bir tasar\u0131m deseni olsada bir yakla\u015f\u0131mdan ibaret olmas\u0131, hi\u00e7 yoktan tercih edilebilir olmas\u0131n\u0131 gerektirmekteyken klasik Asp.NET MVC kay\u0131ts\u0131z \u015farts\u0131z MVC yakla\u015f\u0131m\u0131n\u0131 altyap\u0131 olarak zorunlu tutmay\u0131 tercih etmi\u015ftir. Asp.NET Core mimarisi ise MVC tasar\u0131m desenini tercihimize b\u0131rakarak biz geli\u015ftiricilere se\u00e7me \u00f6zg\u00fcrl\u00fc\u011f\u00fc sa\u011flamaktad\u0131r. Dolay\u0131s\u0131yla &#8220;UseMvc&#8221; metodu bir middleware olarak proje aya\u011fa kald\u0131r\u0131l\u0131rken komple sistemin genel yakla\u015f\u0131m\u0131n\u0131 belirleyecek tarzda tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>\u00d6zel Middleware Olu\u015fturma<\/h3>\n<p>Asp.NET Core 2&#8217;de middleware yap\u0131s\u0131 olu\u015fturmak i\u00e7in yapmam\u0131z gereken tek \u015fey &#8220;Startup&#8221; s\u0131n\u0131f\u0131na kodlar\u0131m\u0131z\u0131 uygun bir \u015fekilde yerle\u015ftirmektir. &#8220;<em>Hocam, uygun bir \u015fekilde yerle\u015ftirmekten kast\u0131n nedir?<\/em>&#8221; diye sorarsan\u0131z e\u011fer onun cevab\u0131n\u0131 yaz\u0131m\u0131z\u0131n devam\u0131nda &#8220;short circuit(k\u0131sa devre)&#8221; konusunu ele al\u0131rken verece\u011fim. \u00d6rne\u011fin; projemiz a\u00e7\u0131l\u0131rken Dependency Injection ile database s\u0131n\u0131f\u0131 olarak tan\u0131mlanan &#8220;DbContext&#8221; t\u00fcrevi s\u0131n\u0131f\u0131m\u0131z\u0131 middleware&#8217;de elde edip, varsa migrationlar\u0131 migrate edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public IConfiguration Configuration { get; set; }\r\n\r\n        public Startup(IConfiguration configuration)\r\n        {\r\n            Configuration = configuration;\r\n        }\r\n\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddDbContext&lt;DatabaseContext&gt;(options =&gt; options.UseSqlServer(Configuration.GetConnectionString(&quot;DefaultConnection&quot;)));\r\n            services.AddMvc();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseStaticFiles();\r\n            app.UseExceptionHandler(&quot;\/Error\/Index&quot;);\r\n            app.UseMvc(routes =&gt;\r\n            {\r\n                routes.MapRoute(\r\n                    name: &quot;Default&quot;,\r\n                    template: &quot;{controller=Home}\/{action=Index}\/{id?}&quot;\r\n                    );\r\n            });\r\n\r\n            #region Custom Middleware\r\n            DatabaseContext context = app.ApplicationServices.GetRequiredService&lt;DatabaseContext&gt;();\r\n            context.Database.Migrate();\r\n            #endregion\r\n        }\r\n    }\r\n<\/pre>\n<p>E\u011fer bu \u015fekilde middleware&#8217;i yazarsan\u0131z a\u015fa\u011f\u0131daki hatayla kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Olu\u015fturma.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Olu\u015fturma.png\" alt=\"Asp.NET Core 2&#039;de Middleware Olu\u015fturma\" width=\"391\" height=\"73\" class=\"aligncenter size-full wp-image-9681\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Olu\u015fturma.png 391w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Olu\u015fturma-300x56.png 300w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><\/a><br \/>\nHatan\u0131n metinsel halide a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<\/p>\n<blockquote><p><em><strong>System.InvalidOperationException: &#8216;Cannot resolve scoped service &#8216;MiddlewareCore.Models.Context.DatabaseContext&#8217; from root provider.&#8217;<\/strong><\/em><\/p><\/blockquote>\n<p>Bu hatay\u0131 iki farkl\u0131 y\u00f6ntemle \u00e7\u00f6zebilirsiniz;<\/p>\n<ol>\n<li><em>Scope olu\u015fturarak;<\/em><br \/>\nUygulama servislerine eri\u015febilmek i\u00e7in scope olu\u015fturabilir ve ard\u0131ndan ilgili scope \u00fczerinden servisi talep edebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            #region Custom Middleware\r\n            using (var serviceScope = app.ApplicationServices.CreateScope())\r\n            {\r\n                DatabaseContext context = serviceScope.ServiceProvider.GetRequiredService&lt;DatabaseContext&gt;();\r\n                context.Database.Migrate();\r\n            }\r\n            #endregion\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/li>\n<li>\n<em>&#8220;Program.cs&#8221; s\u0131n\u0131f\u0131nda &#8220;ValidateScopes&#8221; \u00f6zelli\u011fine &#8220;false&#8221; de\u011ferini vererek;<\/em><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Program\r\n    {\r\n        public static void Main(string&#x5B;] args)\r\n        {\r\n            CreateWebHostBuilder(args).Build().Run();\r\n        }\r\n\r\n        public static IWebHostBuilder CreateWebHostBuilder(string&#x5B;] args) =&gt;\r\n            WebHost.CreateDefaultBuilder(args)\r\n                .UseStartup&lt;Startup&gt;()\r\n            .UseDefaultServiceProvider(option =&gt; option.ValidateScopes = false);\r\n    }\r\n<\/pre>\n<\/li>\n<\/ol>\n<p>Her iki y\u00f6ntemden biri uyguland\u0131\u011f\u0131 taktirde uygulama tetiklenirken middleware devreye girecek ve \u00f6nceden dahil edilmi\u015f &#8220;DbContext&#8221; t\u00fcrevi nesneyi elde ederek, \u00fczerinden migrate i\u015flemini ger\u00e7ekle\u015ftirecektir.<\/p>\n<h3>Middlewarelerin Register Edilme S\u0131ras\u0131<\/h3>\n<p>Yukar\u0131daki sat\u0131rlarda short circuit(k\u0131sa devre) konusuna at\u0131fta bulunmu\u015f, olas\u0131 bir sorunuza istinaden cevab\u0131m\u0131z\u0131 sonraya saklam\u0131\u015ft\u0131k. \u0130\u015fte \u015fimdi o sorunun cevab\u0131n\u0131 verece\u011fimiz sat\u0131rlara gelmi\u015f bulunmaktay\u0131z. <span style=\"font-size:11px;\">(soruyu hat\u0131rlam\u0131yorsan\u0131z &#8220;\u00d6zel Middleware Olu\u015fturma&#8221; alt ba\u015fl\u0131\u011f\u0131n\u0131n ilk paragraf\u0131na h\u0131zl\u0131ca g\u00f6z at\u0131n\u0131z.)<\/span><\/p>\n<p>E\u011fer ki, birden fazla middleware ile \u00e7al\u0131\u015facaksan\u0131z bu middlewarelerin yaz\u0131lma s\u0131ras\u0131 olduk\u00e7a \u00f6nem arz etmektedir. Bunun nedeni; kimi middleware&#8217;ler short circuit(k\u0131sa devre) yaparak direkt i\u015fleyi\u015fi neticelendirmekte, kimileri ise i\u015flevlerini bitirdikten sonra bir sonraki middleware&#8217;e i\u015fleyi\u015fi aktarmaktad\u0131rlar. S\u00f6z gelimi a\u015fa\u011f\u0131daki \u00f6rne\u011fi incelerseniz anlat\u0131lmaya \u00e7al\u0131\u015fan\u0131 daha net izah etmi\u015f olaca\u011f\u0131z;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseStaticFiles();\r\n            app.UseExceptionHandler(&quot;\/Error\/Index&quot;);\r\n            app.UseMvc(routes =&gt;\r\n            {\r\n                routes.MapRoute(\r\n                    name: &quot;Default&quot;,\r\n                    template: &quot;{controller=Home}\/{action=Index}\/{id?}&quot;\r\n                    );\r\n            });\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funda; &#8220;<em>UseDeveloperExceptionPage<\/em>&#8220;, &#8220;<em>UseStaticFiles<\/em>&#8220;, &#8220;<em>UseExceptionHandler<\/em>&#8221; ve &#8220;<em>UseMvc<\/em>&#8221; middleware&#8217;leri kullan\u0131lmaktad\u0131r. Lakin dikkat ederseniz &#8220;<em>UseDeveloperExceptionPage<\/em>&#8221; middleware&#8217;i \u00e7a\u011fr\u0131l\u0131rken &#8220;<em>IsDevelopment<\/em>&#8221; kontrol\u00fc yap\u0131lmakta yani development modundaysak bu middleware&#8217;i \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r. Bu kontrol\u00fcn nedeni; &#8220;<em>UseDeveloperExceptionPage<\/em>&#8221; middleware&#8217;inin short circuit(k\u0131sa devre) bir middleware olmas\u0131ndan kaynaklanmaktad\u0131r. E\u011fer ilgili fonksiyon tetiklenirse i\u015flevsel a\u00e7\u0131dan s\u00fcreci neticelendirece\u011finden dolay\u0131 di\u011fer fonksiyonlara ak\u0131\u015f\u0131 sa\u011flamayacakt\u0131r. Dolay\u0131s\u0131yla &#8220;<em>UseDeveloperExceptionPage<\/em>&#8221; fonksiyonu k\u0131sa devre \u00f6zelli\u011finden dolay\u0131 kontroll\u00fc bir \u015fekilde kullan\u0131lmaktad\u0131r. Di\u011fer fonksiyonlar\u0131m\u0131z ise kendi i\u015flevsellikleri bittikten sonra ak\u0131\u015f\u0131 sonland\u0131rmay\u0131p bir sonraki middleware&#8217;e aktaraca\u011f\u0131ndan dolay\u0131 direkt olarak kullan\u0131labilmektedirler. \u0130\u015fte bu mant\u0131ktan dolay\u0131 middleware&#8217;lerin register edilme s\u0131ralar\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r.<\/p>\n<h3>Run Metodu<\/h3>\n<p>Run metodu yukar\u0131da ele ald\u0131\u011f\u0131m\u0131z short circuit olay\u0131n\u0131 yapmam\u0131z\u0131 sa\u011flayan bir yap\u0131ya sahiptir. \u00d6rne\u011fin a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.Run(async context =&gt; await context.Response.WriteAsync(&quot;Middleware 1.&quot;));\r\n            app.Run(async context =&gt; await context.Response.WriteAsync(&quot;Middleware 2.&quot;));\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"281\" height=\"70\" class=\"aligncenter size-full wp-image-9693\" \/><\/a><br \/>\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Run metodu iki kere kullan\u0131ld\u0131\u011f\u0131 halde ekrana sadece &#8220;Middleware 1.&#8221; sonucunu yazd\u0131rm\u0131\u015f ve k\u0131sa devre ile t\u00fcm ak\u0131\u015f\u0131 sonland\u0131rm\u0131\u015ft\u0131r.<\/p>\n<h3>Use Metodu<\/h3>\n<p>Run metoduna nazaran, devreye girdikten sonra s\u00fcre\u00e7te s\u0131radaki middleware&#8217;i \u00e7a\u011f\u0131rarak ard\u0131ndan o middleware&#8217;\u0131n i\u015flevi bittikten sonra geriye d\u00f6n\u00fcp devam edebilen bir yap\u0131ya sahiptir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;Middleware ba\u015flad\u0131.&quot;);\r\n\r\n                await next.Invoke();\r\n\r\n                Debug.WriteLine(&quot;Middleware sonland\u0131r\u0131l\u0131yor.&quot;);\r\n            });\r\n\r\n            app.Run(async context =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;K\u0131sa devre | short circuit yap\u0131l\u0131yor.&quot;);\r\n                await context.Response.WriteAsync(&quot;--- Short Circuit ---&quot;);\r\n            });\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;Use&#8221; fonksiyonu i\u00e7erisinde &#8220;next.Invoke()&#8221; komutu ile bir sonraki middleware&#8217;i yani &#8220;Run&#8221; fonksiyonunu \u00e7a\u011f\u0131rmaktad\u0131r. &#8220;Run&#8221; fonksiyonunun i\u015flevi bitti\u011fi vakit compiler kald\u0131\u011f\u0131 noktaya geri d\u00f6n\u00fcp devam edecektir.<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00c7\u0131kt\u0131<\/th>\n<th>Output<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-1.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"284\" height=\"60\" class=\"aligncenter size-full wp-image-9695\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-2.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"273\" height=\"63\" class=\"aligncenter size-full wp-image-9697\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&#8220;Use&#8221; metoduyla ilgili bir ba\u015fka \u00f6rnek ele alal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;1. Middleware ba\u015flad\u0131.&quot;);\r\n                await next.Invoke();\r\n                Debug.WriteLine(&quot;1. Middleware sonland\u0131.&quot;);\r\n            });\r\n\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;2. Middleware ba\u015flad\u0131.&quot;);\r\n                await next.Invoke();\r\n                Debug.WriteLine(&quot;2. Middleware sonland\u0131.&quot;);\r\n            });\r\n\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;3. Middleware ba\u015flad\u0131.&quot;);\r\n                await next.Invoke();\r\n                Debug.WriteLine(&quot;3. Middleware sonland\u0131.&quot;);\r\n            });\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-3.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"177\" height=\"94\" class=\"aligncenter size-full wp-image-9700\" \/><\/a><\/p>\n<h3>Map Metodu<\/h3>\n<p>Bazen middleware&#8217;i talep g\u00f6nderilen path&#8217;e g\u00f6re filtrelemek isteyebiliriz. Bunun i\u00e7in &#8220;Use&#8221; ya da &#8220;Run&#8221; fonksiyonlar\u0131nda if kontrol\u00fc sa\u011flayabilir ya da &#8220;Map&#8221; metodu ile de bu i\u015flemi ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;Use middleware tetiklendi.&quot;);\r\n                await next.Invoke();\r\n            });\r\n\r\n            app.Map(&quot;\/example&quot;, internalApp =&gt;\r\n                internalApp.Run(async context =&gt;\r\n                    {\r\n                        Debug.WriteLine(&quot;\/example middleware tetiklendi.&quot;);\r\n                        await context.Response.WriteAsync(&quot;\/example middleware tetiklendi.&quot;);\r\n                    }));\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funu incelerseniz e\u011fer &#8220;\/example&#8221; path&#8217;ine gelen talepler neticesinde &#8220;Map&#8221; fonksiyonunun ikinci parametresinde tan\u0131mlanan middleware devreye sokulacakt\u0131r.<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Path : &#8220;\/&#8221;<\/th>\n<th>Path : &#8220;\/example&#8221;<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Output<\/strong><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-4.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"192\" height=\"25\" class=\"aligncenter size-full wp-image-9704\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-6.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"230\" height=\"35\" class=\"aligncenter size-full wp-image-9706\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>\u00c7\u0131kt\u0131<\/strong><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-5.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"280\" height=\"71\" class=\"aligncenter size-full wp-image-9705\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-7.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"339\" height=\"58\" class=\"aligncenter size-full wp-image-9707\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-7.png 339w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-7-300x51.png 300w\" sizes=\"auto, (max-width: 339px) 100vw, 339px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere middleware&#8217;in path&#8217;e \u00f6zel tetiklenmesini &#8220;Map&#8221; fonksiyonu sayesinde ger\u00e7ekle\u015ftirmi\u015f bulunmaktay\u0131z.<\/p>\n<h3>MapWhen Metodu<\/h3>\n<p>&#8220;Map&#8221; metodu ile sadece requestin yap\u0131ld\u0131\u011f\u0131 path&#8217;e g\u00f6re filtreleme yap\u0131labilirken, &#8220;MapWhen&#8221; metodu ile ise herhangi bir \u015fart ile filtreleme i\u015flemi ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.Use(async (context, next) =&gt;\r\n            {\r\n                Debug.WriteLine(&quot;Use middleware tetiklendi.&quot;);\r\n                await next.Invoke();\r\n            });\r\n            \r\n            app.MapWhen(x =&gt; x.Request.Method == &quot;GET&quot;, internalApp =&gt;\r\n            {\r\n                internalApp.Run(async context =&gt; await context.Response.WriteAsync(&quot;MapWhen Middleware&quot;));\r\n            });\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;GET&#8221; tipinde olan t\u00fcm requestlerde bu middleware tetiklenecektir.<\/p>\n<h3>\u00d6zel Extension Middleware Olu\u015fturma<\/h3>\n<p>\u0130lk olarak middleware g\u00f6revini g\u00f6recek s\u0131n\u0131f\u0131m\u0131z\u0131 in\u015fa edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HelloMiddleware\r\n    {\r\n        readonly RequestDelegate _next;\r\n        public HelloMiddleware(RequestDelegate next)\r\n        {\r\n            _next = next;\r\n        }\r\n        public async Task Invoke(HttpContext context)\r\n        {\r\n            Debug.WriteLine(&quot;Hello 1&quot;);\r\n            await _next.Invoke(context);\r\n            Debug.WriteLine(&quot;Hello 2&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan bu s\u0131n\u0131f\u0131 kullanan extension metodumuzu yazal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static public class HelloMiddlewareExtension\r\n    {\r\n        public static IApplicationBuilder UseHello(this IApplicationBuilder builder)\r\n        {\r\n            return builder.UseMiddleware&lt;HelloMiddleware&gt;();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015eimdi ise olu\u015fturdu\u011fumuz middleware&#8217;i kullanal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            app.UseHello();\r\n\r\n            app.Run(async context =&gt; await context.Response.WriteAsync(&quot;Run middleware&quot;));\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<table>\n<thead>\n<tr>\n<th>\u00c7\u0131kt\u0131<\/th>\n<th>Output<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-9.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"287\" height=\"58\" class=\"aligncenter size-full wp-image-9712\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/10\/Asp.NET-Core-2de-Middleware-Yap\u0131s\u0131-ve-Kullan\u0131m\u0131-8.png\" alt=\"Asp.NET Core 2&#039;de Middleware Yap\u0131s\u0131 ve Kullan\u0131m\u0131\" width=\"66\" height=\"49\" class=\"aligncenter size-full wp-image-9711\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Evet, g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi as\u0131l custom middleware&#8217;i bu \u015fekilde olu\u015fturmu\u015f bulunmaktay\u0131z.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\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, Web yaz\u0131l\u0131mlar\u0131, genellikle kullan\u0131c\u0131larla etkile\u015fim a\u00e7\u0131s\u0131ndan olduk\u00e7a yo\u011fun bir yap\u0131 arz etmektedirler. Kullan\u0131c\u0131lar web sitesinden bir istekte bulunabilmekte ve bu iste\u011fe kar\u015f\u0131l\u0131k server taraf\u0131ndan uygun cevaplar \u00fcretilip g\u00f6nderilmektedir. Ve t\u00fcm s\u00fcre\u00e7 bu \u015fekilde&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":9596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2668,2656],"tags":[2652,2674,2676,2667,2670,2672,2666,2673,2675,2523,2669,2665,2671],"class_list":["post-9671","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2","category-asp-net-core-2-mvc","tag-asp-net-core-2","tag-asp-net-core-2-map-function","tag-asp-net-core-2-mapwhen-function","tag-asp-net-core-2-middleware","tag-asp-net-core-2-run-function","tag-asp-net-core-2-use-function","tag-kisa-devre","tag-map-metodu","tag-mapwhen-metodu","tag-middleware","tag-run-metodu","tag-short-circuit","tag-use-metodu"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9671","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=9671"}],"version-history":[{"count":33,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9671\/revisions"}],"predecessor-version":[{"id":9715,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9671\/revisions\/9715"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/9596"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=9671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=9671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=9671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}