﻿
{"id":4574,"date":"2016-06-27T17:08:59","date_gmt":"2016-06-27T17:08:59","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4574"},"modified":"2016-06-27T17:08:59","modified_gmt":"2016-06-27T17:08:59","slug":"asp-net-mvc-signalr-ve-sqldependency-esliginde-notifications","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-signalr-ve-sqldependency-esliginde-notifications\/","title":{"rendered":"Asp.NET MVC &#8211; SignalR ve SqlDependency E\u015fli\u011finde Notifications"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>G\u00fcn\u00fcm\u00fcz web projeleri server ve development merkezinden \u00e7\u0131karak, kullan\u0131c\u0131 merkezli bir hal alm\u0131\u015flard\u0131r. Yani demem o ki, yap\u0131lan t\u00fcm i\u015flemler ne kadar yo\u011funluk, s\u00fcre\u00e7 ve maliyet kavramlar\u0131yla olgunla\u015fsada, bu olgulara kar\u015f\u0131l\u0131k kullan\u0131c\u0131 olaya sadece vakit nakittir ilkesiyle yani &#8220;en k\u0131sa s\u00fcrede&#8221; ifadesiyle bakmakta ve bu \u015fekilde nitelendirerek tercih edilebilirlik \u00f6zelli\u011fi g\u00f6stermektedir. Haliyle projelerde maliyetle beraber s\u00fcre ve ortak\u00e7\u0131s\u0131 performans\u0131 d\u00fc\u015f\u00fcnen biz yaz\u0131l\u0131m geli\u015ftiriciler, bu fakt\u00f6rlerin yan\u0131nda kullan\u0131c\u0131 perspektifindende olay\u0131 ele almal\u0131 ve bu fakt\u00f6rlerden soyutlanm\u0131\u015f bir \u015fekilde vakit kavram\u0131n\u0131 dahada minimize edebilmek \u00fczerine kafa yormal\u0131y\u0131z.<\/p>\n<p>\u0130\u015fte bu bahsetti\u011fim yakla\u015f\u0131mda bir konuyla sizlere i\u00e7erik sunuyor olaca\u011f\u0131m. Web sitemizin veritaban\u0131nda olan herhangi bir olay\u0131(ki bu olay\u0131 biz belirleyebiliyoruz) Client&#8217;lara otomatik olarak yans\u0131tacak ve bu i\u015flemi asenkron bir \u015fekilde post-back i\u015flemlerine girmeden ger\u00e7ekle\u015ftirecek bir yap\u0131 \u00fczerine konu\u015faca\u011f\u0131z. Bu yap\u0131n\u0131n in\u015fa s\u00fcrecinde veritaban\u0131n\u0131 takip edecek olan ve yak\u0131n zamanda \u00fczerine kalem oynatt\u0131\u011f\u0131m\u0131z <a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-sqldependency-ile-query-notification\/\" target=\"_blank\">SqlDependency<\/a> s\u0131n\u0131f\u0131yken, t\u00fcm i\u015flemi asenkron bir \u015fekilde y\u00fcr\u00fctecek olan ve clientlar ile haberle\u015fmemizi sa\u011flayacak olan yap\u0131m\u0131z ise SignalR k\u00fct\u00fcphanesi olacakt\u0131r.<\/p>\n<p>Yaz\u0131m\u0131zda her konuda yapt\u0131\u011f\u0131m\u0131z gibi \u00f6rnek bir proje \u00fczerinde seyredece\u011fiz. Hal b\u00f6yleyken bo\u015f bir Asp.NET MVC projesi a\u00e7\u0131n\u0131z ve &#8220;Home(Controller).cs&#8221; isminde bir Controller s\u0131n\u0131f\u0131 ekleyiniz. Ayriyetten eklenen bu Controller&#8217;a &#8220;Index&#8221; isminde bir Action metod olu\u015fturunuz ve Views katman\u0131ndaki .cshtml g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcde fiziksel olarak ekleyiniz. Bunlar\u0131n yan\u0131nda <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNet.SignalR\/2.0.3\" target=\"_blank\">bu<\/a> adresteki SignalR NuGet paketini<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nInstall-Package Microsoft.AspNet.SignalR -Version 2.0.3\r\n<\/pre>\n<p>komutunu &#8216;Package Manager Console&#8217; penceresinde \u00e7al\u0131\u015ft\u0131rarak projenize entegre edin. (<em>Tabi SignalR paketini &#8216;Manage NuGet Packages&#8217; isimli pencereden de projenize entegre edebilirsiniz. Bu i\u015flemleri bildi\u011finizi ve yapt\u0131\u011f\u0131n\u0131z\u0131 varsayarak h\u0131zl\u0131 ge\u00e7iyorum.<\/em>) Son olarak \u00f6rneklendirmede kullanaca\u011f\u0131m\u0131z <a href=\"http:\/\/www.gencayyildiz.com\/blog\/northwind-turkce-versiyonu\/\" target=\"_blank\">Northwind <\/a>veritaban\u0131n\u0131 SQL Server&#8217;a y\u00fckleyiniz.<\/p>\n<p>\u0130\u015fte \u015fimdi ad\u0131mlar\u0131 seri bir \u015fekilde takip etmeye ve makaleyi sindirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h3>Ad\u0131m 1<\/h3>\n<p>\u0130lk olarak \u00e7al\u0131\u015faca\u011f\u0131m\u0131z veritaban\u0131n\u0131n(Northwind) Service Broker bilgisi \u00f6nemlidir.<br \/>\nBu bilgiyi \u00f6\u011frenmek i\u00e7in<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSELECT name, is_broker_enabled FROM sys.databases\r\n<\/pre>\n<p>komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Asp.NET-MVC-SignalR-ve-SqlDependency-E\u015fli\u011finde-Notifications.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Asp.NET-MVC-SignalR-ve-SqlDependency-E\u015fli\u011finde-Notifications-300x184.jpg\" alt=\"Asp.NET MVC - SignalR ve SqlDependency E\u015fli\u011finde Notifications\" width=\"300\" height=\"184\" class=\"aligncenter size-medium wp-image-4585\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Asp.NET-MVC-SignalR-ve-SqlDependency-E\u015fli\u011finde-Notifications-300x184.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Asp.NET-MVC-SignalR-ve-SqlDependency-E\u015fli\u011finde-Notifications.jpg 418w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nEkran g\u00f6r\u00fcnt\u00fcs\u00fcnde de g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;1&#8221; de\u011ferine sahip olan veritabanlar\u0131n Service Broker&#8217;\u0131 aktif demektir. Yok e\u011fer &#8220;0&#8221; de\u011ferini g\u00f6r\u00fcyorsan\u0131z<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nALTER DATABASE Northwind SET ENABLE_BROKER\r\n<\/pre>\n<p>komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z, o veritaban\u0131 i\u00e7in Service Broker&#8217;\u0131 aktifle\u015ftirmeniz i\u00e7in yeterlidir.<\/p>\n<h3>Ad\u0131m 2<\/h3>\n<p>Yap\u0131n\u0131n ilerisinde kullanmak i\u00e7in veritaban\u0131 provider bilgisini web.config dosyas\u0131na a\u015fa\u011f\u0131daki gibi ta\u015f\u0131yoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;configuration&gt;\r\n  &lt;connectionStrings&gt;\r\n    &lt;add name=&quot;BaglantiProvider&quot; providerName=&quot;System.Data.SqlClient&quot; connectionString=&quot;Server=.;Database=Northwind;Trusted_Connection=True;&quot; \/&gt;\r\n  &lt;\/connectionStrings&gt;\r\n.\r\n.\r\n.\r\n&lt;\/configuration&gt;\r\n<\/pre>\n<h3>Ad\u0131m 3<\/h3>\n<p>Projemizde App_Start klas\u00f6r\u00fcne Startup.cs ekliyoruz ve i\u00e7erisine a\u015fa\u011f\u0131daki i\u015flemleri ger\u00e7ekle\u015ftiriyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void Configuration(IAppBuilder app)\r\n        {\r\n            app.MapSignalR();\r\n        }\r\n    }\r\n<\/pre>\n<h3>Ad\u0131m 4<\/h3>\n<p>Ard\u0131ndan Global.asax dosyam\u0131z\u0131 a\u00e7\u0131yor ve i\u00e7erisinde a\u015fa\u011f\u0131daki gibi ayar ger\u00e7ekle\u015ftiriyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MvcApplication : System.Web.HttpApplication\r\n    {\r\n        protected void Application_Start()\r\n        {\r\n            SqlDependency.Start(ConfigurationManager.ConnectionStrings&#x5B;&quot;BaglantiProvider&quot;].ConnectionString);\r\n            AreaRegistration.RegisterAllAreas();\r\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\r\n        }\r\n\r\n        protected void Application_End()\r\n        {\r\n            SqlDependency.Stop(ConfigurationManager.ConnectionStrings&#x5B;&quot;BaglantiProvider&quot;].ConnectionString);\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada web.config i\u00e7erisine g\u00f6md\u00fc\u011f\u00fcm\u00fcz &#8220;BaglantiProvider&#8221; isimli sa\u011flay\u0131c\u0131n\u0131n ConnectionString \u00f6zelli\u011fi ile direkt olarak provider\u0131 get ediyor ve SqlDependency ile bu ba\u011flant\u0131 yolunun takibini ba\u015flat\u0131yoruz.<\/p>\n<h3>Ad\u0131m 5<\/h3>\n<p>Ard\u0131ndan projede &#8220;SignalHub&#8221; isimli bir klas\u00f6r olu\u015fturup i\u00e7erisine &#8220;PersonelHub&#8221; s\u0131n\u0131f\u0131 ekliyoruz ve a\u015fa\u011f\u0131daki gibi i\u00e7ini dolduruyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class PersonelHub : Hub\r\n    {\r\n        public static void Show()\r\n        {\r\n            IHubContext context = GlobalHost.ConnectionManager.GetHubContext&lt;PersonelHub&gt;();\r\n            context.Clients.All.tetikle();\r\n        }\r\n    }\r\n<\/pre>\n<h3>Ad\u0131m 6<\/h3>\n<p>Models katman\u0131nda &#8220;Personel&#8221; isminde bir Entity(Class) ve &#8220;VeriTabaniIslemleri&#8221; isminde de bir class tan\u0131ml\u0131yoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Personel\r\n    {\r\n        public int PersonelID { get; set; }\r\n        public string Adi { get; set; }\r\n        public string SoyAdi { get; set; }\r\n        public string Unvan { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class VeriTabaniIslemleri\r\n    {\r\n        public IEnumerable&lt;Personel&gt; PersonelleriGetir()\r\n        {\r\n            using (SqlConnection baglanti = new SqlConnection(ConfigurationManager.ConnectionStrings&#x5B;&quot;BaglantiProvider&quot;].ConnectionString))\r\n            {\r\n                if (baglanti.State == ConnectionState.Closed)\r\n                    baglanti.Open();\r\n                using (SqlCommand cmd = new SqlCommand(@&quot;SELECT &#x5B;PERSONELID], &#x5B;AD\u0130], &#x5B;SOYAD\u0130], &#x5B;UNVAN] from &#x5B;dbo].&#x5B;PERSONELLER]&quot;, baglanti))\r\n                {\r\n                    SqlDependency dependency = new SqlDependency(cmd);\r\n                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);\r\n                    using (SqlDataReader dr = cmd.ExecuteReader())\r\n                    {\r\n                        List&lt;Personel&gt; Personeller = new List&lt;Personel&gt;();\r\n                        while (dr.Read())\r\n                        {\r\n                            Personeller.Add(new Personel\r\n                            {\r\n                                Adi = dr&#x5B;&quot;Adi&quot;].ToString(),\r\n                                PersonelID = Convert.ToInt32(dr&#x5B;&quot;PersonelID&quot;].ToString()),\r\n                                SoyAdi = dr&#x5B;&quot;SoyAdi&quot;].ToString(),\r\n                                Unvan = dr&#x5B;&quot;Unvan&quot;].ToString()\r\n                            });\r\n                        }\r\n                        return Personeller;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)\r\n        {\r\n            PersonelHub.Show();\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;VeriTabaniIslemleri&#8221; s\u0131n\u0131f\u0131 i\u00e7erisinde &#8220;PersonelleriGetir&#8221; isimli metod ile veritaban\u0131ndaki personelleri liste olarak elde etmekteyiz.<\/p>\n<h3>Ad\u0131m 7<\/h3>\n<p>Index Action&#8217;\u0131n\u0131n .cshtml g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc a\u015fa\u011f\u0131daki gibi d\u00fczenleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@{\r\n    Layout = null;\r\n}\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;title&gt;Personeller&lt;\/title&gt;\r\n    &lt;script src=&quot;~\/scripts\/jquery-1.10.2.min.js&quot;&gt;&lt;\/script&gt;\r\n    &lt;script src=&quot;~\/scripts\/jquery.signalR-2.2.0.min.js&quot;&gt;&lt;\/script&gt;\r\n    &lt;script src=&quot;~\/signalr\/hubs&quot; type=&quot;text\/javascript&quot;&gt;&lt;\/script&gt;\r\n    &lt;script type=&quot;text\/javascript&quot;&gt;\r\n        $(function () {\r\n            var pers = $.connection.personelHub;\r\n\r\n            pers.client.tetikle = function () {\r\n                getData();\r\n            };\r\n\r\n            $.connection.hub.start();\r\n            getData();\r\n        });\r\n\r\n        function getData() {\r\n            var tbl = $('#PersonelListesi');\r\n            $.ajax({\r\n                url: '@Url.Action(&quot;PersonelleriGetir&quot;, &quot;Home&quot;)',\r\n                type: 'GET',\r\n                datatype: 'json',\r\n                success: function (data) {\r\n                    tbl.html(data);\r\n                }\r\n            });\r\n        }\r\n    &lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n    &lt;div id=&quot;PersonelListesi&quot;&gt;\r\n\r\n    &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Burada JavaScript komutlar\u0131yla &#8220;personelHub&#8221; isminde bir Hub olu\u015fturuyoruz ve &#8220;PersonelHub.cs&#8221; s\u0131n\u0131f\u0131m\u0131zda dinamik olarak \u00fcretilen &#8220;tetikle&#8221; de\u011ferine bu Hub&#8217;\u0131 ba\u011fl\u0131yoruz. Haliyle bu ili\u015fkide bir fonksiyon devrededir.<\/p>\n<p>Yani ne zaman &#8220;PersonelHub.cs&#8221; s\u0131n\u0131f\u0131ndaki Show metodu tetiklenir, Client&#8217;lar da bu fonksiyon tetiklenecektir.<\/p>\n<h3>Ad\u0131m 8<\/h3>\n<p>&#8220;Helper&#8221; isminde bir class a\u00e7\u0131n ve i\u00e7erisinde a\u015fa\u011f\u0131daki i\u015flemleri yap\u0131n.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Helper\r\n    {\r\n        public static string RazorViewRender(object model, string filePath)\r\n        {\r\n            var sw = new StringWriter();\r\n            var context = new HttpContextWrapper(HttpContext.Current);\r\n            var routeData = new RouteData();\r\n            var controllerContext = new ControllerContext(new RequestContext(context, routeData), new HomeController());\r\n            var razor = new RazorView(controllerContext, filePath, null, false, null);\r\n            razor.Render(new ViewContext(controllerContext, razor, new ViewDataDictionary(model), new TempDataDictionary(), sw), sw);\r\n            return sw.ToString();\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu s\u0131n\u0131f\u0131m\u0131z <a href=\"http:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-programatik-olarak-cshtml-dosyasini-render-etmek\/\" target=\"_blank\">Asp.NET MVC \u2013 Programatik Olarak .cshtml Dosyas\u0131n\u0131 Render Etmek<\/a> ba\u015fl\u0131kl\u0131 makalemde de bahsetti\u011fim gibi programatik olarak View render etmemizi sa\u011flayacakt\u0131r.<\/p>\n<h3>Ad\u0131m 9<\/h3>\n<p>7. ad\u0131mdaki &#8220;PersonelleriGetir&#8221; Action&#8217;\u0131n\u0131 Controller&#8217;da olu\u015fturun ve a\u015fa\u011f\u0131daki gibi i\u00e7erisini doldurun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        public ActionResult Index()\r\n        {\r\n            return View();\r\n        }\r\n\r\n        public string PersonelleriGetir()\r\n        {\r\n            VeriTabaniIslemleri Veri = new VeriTabaniIslemleri();\r\n            var Personeller = Veri.PersonelleriGetir();\r\n            return Helper.RazorViewRender(Personeller, &quot;~\/Views\/Shared\/_PersonelListesi.cshtml&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<h3>Ad\u0131m 10<\/h3>\n<p>9. ad\u0131mdaki &#8220;_PersonelListesi.cshtml&#8221; dosyas\u0131n\u0131 olu\u015fturun ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi olu\u015fturun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model IEnumerable&lt;SingelRDBNotify.Models.Entitys.Personel&gt;\r\n\r\n&lt;table class=&quot;table&quot;&gt;\r\n    &lt;tr&gt;\r\n        &lt;th&gt;\r\n            Ad\u0131\r\n        &lt;\/th&gt;\r\n        &lt;th&gt;\r\n            Soyad\u0131\r\n        &lt;\/th&gt;\r\n        &lt;th&gt;\r\n            \u00dcnvan\r\n        &lt;\/th&gt;\r\n    &lt;\/tr&gt;\r\n\r\n    @foreach (var item in Model)\r\n    {\r\n        &lt;tr&gt;\r\n            &lt;td&gt;\r\n                @item.Adi\r\n            &lt;\/td&gt;\r\n            &lt;td&gt;\r\n                @item.SoyAdi\r\n            &lt;\/td&gt;\r\n            &lt;td&gt;\r\n                @item.Unvan\r\n            &lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n    }\r\n&lt;\/table&gt;\r\n<\/pre>\n<p>Bu ad\u0131mdan da sonra projenizi derleyip \u00e7al\u0131\u015ft\u0131r\u0131n\u0131z. A\u015fa\u011f\u0131daki videoda oldu\u011fu gibi Personeller tablosundaki verilerle oynay\u0131n\u0131z ve Client&#8217;taki de\u011fi\u015fiklikleri takip ediniz.<br \/>\n<iframe loading=\"lazy\" width=\"600\" height=\"400\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/AtCpiywSQB0\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>\nAyriyetten projemizin birden fazla Client \u00fczerinde nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki videodan da inceleyebilirsiniz.<br \/>\n<iframe loading=\"lazy\" width=\"600\" height=\"400\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/KGDJQ5Tlm1s\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>Bir yaz\u0131m\u0131z\u0131n daha sonuna gelmi\u015f bulunmaktay\u0131z. Bol bol faydalanman\u0131z dile\u011fiyle&#8230;<br \/>\nOkudu\u011funuz i\u00e7in te\u015fekk\u00fcrlerimi sunar\u0131m&#8230;<br \/>\nBir sonraki makalemizde 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, G\u00fcn\u00fcm\u00fcz web projeleri server ve development merkezinden \u00e7\u0131karak, kullan\u0131c\u0131 merkezli bir hal alm\u0131\u015flard\u0131r. Yani demem o ki, yap\u0131lan t\u00fcm i\u015flemler ne kadar yo\u011funluk, s\u00fcre\u00e7 ve maliyet kavramlar\u0131yla olgunla\u015fsada, bu olgulara kar\u015f\u0131l\u0131k kullan\u0131c\u0131 olaya&#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":3453,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[746,1273,283,278,1272,958,787,1274,639,1263],"class_list":["post-4574","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-mvc","tag-asp-net-mvc","tag-manage-nuget-packages","tag-mvc","tag-northwind","tag-notifications","tag-nuget","tag-package-manager-console","tag-service-broker","tag-signalr","tag-sqldependency"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4574","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=4574"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4574\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3453"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4574"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4574"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}