﻿
{"id":3231,"date":"2015-09-03T22:59:21","date_gmt":"2015-09-03T22:59:21","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3231"},"modified":"2015-09-09T22:24:47","modified_gmt":"2015-09-09T22:24:47","slug":"asp-net-mvc-jsonresult-ile-veri-donerken-recursionlimit-asildirecursionlimit-exceeded-hatasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-jsonresult-ile-veri-donerken-recursionlimit-asildirecursionlimit-exceeded-hatasi\/","title":{"rendered":"Asp.NET MVC &#8211; JsonResult \u0130le Veri D\u00f6nerken RecursionLimit A\u015f\u0131ld\u0131(RecursionLimit Exceeded) Hatas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bir proje \u00fczerinde Ajax i\u015flemleriyle oyalan\u0131rken alm\u0131\u015f oldu\u011fum &#8220;RecursionLimit a\u015f\u0131ld\u0131(RecursionLimit exceeded)&#8221; hatas\u0131n\u0131n ald\u0131m.Lakin bu hatay\u0131 ald\u0131\u011f\u0131m\u0131 fark etmeden \u00f6nce allem edip gullem edip projede ilgili k\u0131sm\u0131n %80 alt yap\u0131s\u0131n\u0131 de\u011fi\u015ftirdim yok.Olmuyor.Ajax i\u015flemlerinde al\u0131nan hatalar bariz bir \u015fekilde takip edilemedi\u011fi i\u00e7in ya taray\u0131c\u0131dan eklentilerle durumu takip edersiniz ya da Ajax ile hata kontrol\u00fc uygulars\u0131n\u0131z.Tabi ki de ben her birini denedim ama ald\u0131\u011f\u0131m hatalar genellikle serverdan gelen derlenmi\u015f kod \u00e7\u0131kt\u0131lar\u0131 oldu\u011fu i\u00e7in \u00fc\u015fendi\u011fimden dolay\u0131 kodlara g\u00f6z atmad\u0131m.Haliyle bo\u015f u\u011fra\u015flar neticesinde bana gelen derleme kod sat\u0131rlar\u0131 aras\u0131nda(yaz\u0131n\u0131n devam\u0131nda \u00f6rnek ekran g\u00f6r\u00fcnt\u00fcs\u00fc olarak g\u00f6receksiniz) &#8220;RecursionLimit a\u015f\u0131ld\u0131&#8221; hatas\u0131n\u0131 g\u00f6rd\u00fcm.<\/p>\n<p>Break &#8211; Point ile bakal\u0131m hatan\u0131n sebebi nedir derken en az yar\u0131m saatim gitti.Me\u011fersem, belirli durumlar s\u00f6z konusu oldu\u011fu zaman program\u0131n ak\u0131\u015f\u0131 bir d\u00f6ng\u00fcye girmekte ve bu b\u00f6yle gitmekteymi\u015f.Taaa ki, RecursionLimit a\u015f\u0131lana kadar.<\/p>\n<p>\u015eimdi RecursionLimit hatas\u0131n\u0131 hangi durumda ald\u0131\u011f\u0131m\u0131, bu hataya sebep olan d\u00f6ng\u00fcye neden girildi\u011fini ve sonu\u00e7 olarak nas\u0131l bir \u00f6nlemle bu hatay\u0131 onard\u0131\u011f\u0131m\u0131 irdeleyece\u011fiz.<\/p>\n<p>Projemin veritaban\u0131nda aralar\u0131nda Foreign Key Constraint ile ili\u015fki kurulmu\u015f tablolar\u0131m mevcut.Haliyle bu diyagrama sahip bir veritaban\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131yorum.<\/p>\n<p>\u015eimdi bu duruma benzer bir senaryoda ya\u015fad\u0131\u011f\u0131m\u0131 \u00f6zetleyeyim.<br \/>\nBir &#8220;Okul&#8221; isminde veritaban\u0131 olu\u015ftural\u0131m ve &#8220;Siniflar&#8221; ve &#8220;Ogrenciler&#8221; isminde iki tablomuz olsun.Tablolar\u0131m\u0131z kendi aralar\u0131nda Foreign Key Constraint ile ili\u015fkisel yap\u0131da olsunlar.Bir s\u0131n\u0131f birden fazla \u00f6\u011frenciyi bar\u0131nd\u0131rabilecek yap\u0131da yani ve nihayetinde Linq To Sql ile veritaban\u0131m\u0131z ile proje aras\u0131nda ba\u011flant\u0131 kural\u0131m.<\/p>\n<p>Hemen &#8220;Siniflar.cs&#8221; isimli bir partial s\u0131n\u0131f olu\u015fturarak a\u015fa\u011f\u0131daki property eklemesini ger\u00e7ekle\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    partial class Siniflar\r\n    {\r\n        VeriTabaniDataContext Veri = new VeriTabaniDataContext();\r\n        public List&lt;Ogrenciler&gt; SinifaBagliOgrenciler\r\n        {\r\n            get\r\n            {\r\n                return Veri.Ogrencilers.Where(o =&gt; o.SinifID == ID).ToList();\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada yapt\u0131\u011f\u0131m\u0131z i\u015flemin sebebini izah etmeye gerek yok.\u015eimdi siz, &#8220;ulan zaten ili\u015fkili tablolar aras\u0131nda LINQ esneklik sa\u011fl\u0131yor.Sen neden b\u00f6yle bir propertye ihtiya\u00e7 duyuyorsun?&#8221; diyebilirsiniz.Benim bunu a\u00e7\u0131klamam, \u015fuanda elimdeki projeyi ba\u015ftan sona size izah etmem demektir.Haliyle yaz\u0131l\u0131mc\u0131n\u0131n i\u015fi bazen hamall\u0131k oldu\u011fu i\u00e7in en pratik ve h\u0131zl\u0131 i\u015flemleri sa\u011flayan algoritmalar\u0131 tercih edebilme yetkisine sahiptir.Bu y\u00fczden g\u00fcn gelir sizlerde b\u00f6yle bir duruma ihtiya\u00e7 duyabilirsiniz.Ben benzer bir durumda ilgili hatayla kar\u015f\u0131la\u015ft\u0131\u011f\u0131m i\u00e7in m\u00fcmk\u00fcn mertebe yak\u0131n bir senaryo \u00e7izmeye \u00e7al\u0131\u015f\u0131yorum.<\/p>\n<p>\u0130lgili Controller&#8217;a ise a\u015fa\u011f\u0131daki Action metodu olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;HttpPost]\r\n        public JsonResult Post(int id)\r\n        {\r\n            VeriTabaniDataContext Veri = new VeriTabaniDataContext();\r\n\r\n            Siniflar Sinif = Veri.Siniflars.FirstOrDefault(s =&gt; s.ID == id);\r\n            return Json(Sinif, JsonRequestBehavior.AllowGet);\r\n        }\r\n<\/pre>\n<p>\u015eimdi yukar\u0131daki &#8220;Post&#8221; isimli Action metodunu Ajax ile tetikleyelim.<\/p>\n<p>Ajax ile Post i\u015flemi neticesinde id parametresinden gelen de\u011fere g\u00f6re veritaban\u0131ndan ilgili s\u0131n\u0131f\u0131 elde edip Json metoduyla geriye return yapal\u0131m.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/09\/Asp.NET-MVC-\u2013-JsonResult-\u0130le-Veri-D\u00f6nerken-RecursionLimit-A\u015f\u0131ld\u0131RecursionLimit-Exceeded-Hatas\u0131.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/09\/Asp.NET-MVC-\u2013-JsonResult-\u0130le-Veri-D\u00f6nerken-RecursionLimit-A\u015f\u0131ld\u0131RecursionLimit-Exceeded-Hatas\u0131.png\" alt=\"Asp.NET MVC \u2013 JsonResult \u0130le Veri D\u00f6nerken RecursionLimit A\u015f\u0131ld\u0131(RecursionLimit Exceeded) Hatas\u0131\" width=\"324\" height=\"207\" class=\"aligncenter size-full wp-image-3233\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/09\/Asp.NET-MVC-\u2013-JsonResult-\u0130le-Veri-D\u00f6nerken-RecursionLimit-A\u015f\u0131ld\u0131RecursionLimit-Exceeded-Hatas\u0131.png 324w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/09\/Asp.NET-MVC-\u2013-JsonResult-\u0130le-Veri-D\u00f6nerken-RecursionLimit-A\u015f\u0131ld\u0131RecursionLimit-Exceeded-Hatas\u0131-300x192.png 300w\" sizes=\"auto, (max-width: 324px) 100vw, 324px\" \/><\/a><\/p>\n<p>Ben Ajax ile hata kontrol mekanizmas\u0131n\u0131 kullanarak ilgili hatay\u0131 g\u00f6r\u00fcnt\u00fcledim.Hata derlenmi\u015f kaynak kodu olarak gelmektedir ve i\u00e7eri\u011finde ki hatay\u0131 haber veren ilgili sat\u0131r\u0131 vurgulayarak g\u00f6r\u00fcnt\u00fcy\u00fc yukar\u0131da payla\u015f\u0131yorum.<\/p>\n<p>Evet, buraya kadar bu hatay\u0131 nas\u0131l bir durumda ald\u0131\u011f\u0131m\u0131 sizlere \u00f6rnek bir senaryoyla g\u00f6stermi\u015f oldum.G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ili\u015fkisel tablolar aras\u0131nda yukar\u0131daki gibi bir property kullan\u0131rsan\u0131z yaz\u0131l\u0131m ak\u0131\u015f\u0131 sonsuz bir d\u00f6ng\u00fcye girmekte ve buda RecursionLimit s\u0131n\u0131r\u0131n\u0131 a\u015fmaktad\u0131r.Haliyle bu durum bize RecursionLimit a\u015f\u0131ld\u0131 hatas\u0131 olarak geri d\u00f6nmektedir.<\/p>\n<p>Tabi ki de bu hatayla, bu ya da benzeri durumlarda da kar\u015f\u0131la\u015fabilirsiniz.O y\u00fczde kesinlikle Ajax ya da Json veri yap\u0131lar\u0131yla \u00e7al\u0131\u015f\u0131yorsan\u0131z hata durumlar\u0131nda elinizdeki tek veri kaynak kod dahi olsa detayl\u0131ca de\u011ferlendirmenizi tavsiye ederim.<\/p>\n<p>\u015eimdi, k\u0131saca hatan\u0131n neden meydana geldi\u011fi \u00fczerine pratik bir a\u00e7\u0131dan isti\u015fare ettikten sonra &#8220;bu hata nas\u0131l atlat\u0131l\u0131r?&#8221; sorusuna de\u011finece\u011fiz.<\/p>\n<p>JsonResult ile geriye Json metoduyla bir model g\u00f6nderdi\u011fimizde, Json metodu o modeli Json veri yap\u0131s\u0131na \u00e7evirmekte ve \u00f6yle d\u00f6nd\u00fcrmektedir.\u0130lgili modelin property isimlerini \u00e7evirece\u011fi Json veri yap\u0131s\u0131ndaki node isimlerine kar\u015f\u0131l\u0131k getirmekte ve verileri de ona g\u00f6re dizayn etmektedir.B\u00f6yle bir senaryoda verilen modelin propertyleri kompleks bir yap\u0131ya sahip oldu\u011fu i\u00e7in \u00e7evirme i\u015flemi esnas\u0131nda durmadan sonsuz bir d\u00f6ng\u00fcye girilmekte ve nihayetinde ayn\u0131 nesne i\u00e7erisinde sonsuz bir Json veri tipine \u00e7evirme i\u015flemi ger\u00e7ekle\u015ftirilmeye zorlanmaktad\u0131r.Haliyle bu hatan\u0131n temel sebebi bu mant\u0131ksal paradokstan kaynaklanmaktad\u0131r.<\/p>\n<p><strong>Peki bu hatadan nas\u0131l kurtulaca\u011f\u0131z?<\/strong><\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;HttpPost]\r\n        public JsonResult Post(int id)\r\n        {\r\n            VeriTabaniDataContext Veri = new VeriTabaniDataContext();\r\n\r\n            Siniflar Sinif = Veri.Siniflars.FirstOrDefault(s =&gt; s.ID == id);\r\n            var JsonModel = new\r\n            {\r\n                SinifAdi = Sinif.SinifAdi,\r\n                ID = Sinif.ID,\r\n                Ogrenciler = from o in Sinif.SinifaBagliOgrenciler\r\n                             select new\r\n                             {\r\n                                 Adi = o.Adi,\r\n                                 SoyAdi = o.SoyAdi,\r\n                                 ID = o.ID\r\n                             }\r\n            };\r\n            return Json(JsonModel, JsonRequestBehavior.AllowGet);\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi geriye g\u00f6nderece\u011fimiz modeli Anonymous Types \u015feklinde tekrardan tertipleyip g\u00f6nderiyoruz ve hatta dikkat ederseniz e\u011fer model i\u00e7inde RecursionLimit hatas\u0131na d\u00fc\u015f\u00fcrebilecek propertydeki elemanlar\u0131 tekrardan LINQ sorgusuyla Anonymous Types&#8217;a \u00e7eviriyoruz.<\/p>\n<p>\u0130\u015fte RecursionLimit hatas\u0131 bu \u015fekilde d\u00fczeltilebiliyor&#8230;<\/p>\n<p>Biliyorum, anla\u015f\u0131lmas\u0131 zor bir yaz\u0131 oldu.Ama bu hatan\u0131n \u00e7\u00f6z\u00fcm\u00fc i\u00e7in en az\u0131nda makalenin sonundaki \u00e7\u00f6z\u00fcm size yol g\u00f6sterecektir.Anlayaca\u011f\u0131n\u0131z\u0131 umuyorum ki kar\u0131\u015f\u0131k algoritmalar i\u00e7indeki kompleks hatalar \u00fczerine senaryo olu\u015fturup okuyucuya aktarmak olduk\u00e7a zor.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#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>Bir proje \u00fczerinde Ajax i\u015flemleriyle oyalan\u0131rken alm\u0131\u015f oldu\u011fum &#8220;RecursionLimit a\u015f\u0131ld\u0131(RecursionLimit exceeded)&#8221; hatas\u0131n\u0131n ald\u0131m.Lakin bu hatay\u0131 ald\u0131\u011f\u0131m\u0131 fark etmeden \u00f6nce allem edip gullem edip projede ilgili k\u0131sm\u0131n %80 alt yap\u0131s\u0131n\u0131 de\u011fi\u015ftirdim yok.Olmuyor.Ajax i\u015flemlerinde al\u0131nan hatalar&#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":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,11,600,780],"tags":[744,768,745,746,772,530,741,283,769,770,771],"class_list":["post-3231","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ajax","category-asp-net-mvc","category-asp-net-mvc-5","category-json","tag-ajax","tag-anonymous-types","tag-asp-net","tag-asp-net-mvc","tag-foreign-key-constraint","tag-json","tag-jsonresult","tag-mvc","tag-recursionlimit","tag-recursionlimit-asildi","tag-recursionlimit-exceeded"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3231","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=3231"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3231\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}