﻿
{"id":17825,"date":"2020-09-13T14:21:48","date_gmt":"2020-09-13T14:21:48","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17825"},"modified":"2020-09-13T14:26:15","modified_gmt":"2020-09-13T14:26:15","slug":"asp-net-core-signalr-serisi-6-baglanti-olaylari","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-serisi-6-baglanti-olaylari\/","title":{"rendered":"Asp.NET Core \u2013 SignalR Serisi #6 &#8211; Ba\u011flant\u0131 Olaylar\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>SignalR mimarisi, Hub&#8217;lara yap\u0131lan ba\u011flant\u0131lar\u0131 y\u00f6netmek ve izleyebilmek i\u00e7in <em>OnConnectedAsync<\/em> ve <em>OnDisconnectedAsync<\/em> olmak \u00fczere iki adet virtual metot sunmaktad\u0131r. Bu metotlar\u0131 override ederek, bir Hub&#8217;a ba\u011fl\u0131 olan t\u00fcm client&#8217;lardan haberdar olunabilmekte ve b\u00fct\u00fcnsel i\u015flemleri rahatl\u0131kla ger\u00e7ekle\u015ftirebilmekteyiz. \u015eimdi s\u0131ras\u0131yla iki fonksiyonu inceleyelim;<\/p>\n<ul>\n<li><strong>OnConnectedAsync<\/strong><br \/>\nBir client taraf\u0131ndan Hub&#8217;a ba\u011flant\u0131 kuruldu\u011fu esnada tetiklenen fonksiyondur. Ba\u011flant\u0131 kuran client&#8217;a dair connectionid vs. gibi bilgileri vermekte ve b\u00f6ylece t\u00fcm ba\u011flant\u0131lar y\u00f6netilebilmekte ve izlenebilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public async override Task OnConnectedAsync()\r\n        {\r\n            await Clients.All.SendAsync(&quot;userJoined&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n<\/pre>\n<\/li>\n<li><strong>OnDisconnectedAsync<\/strong><br \/>\nBir client&#8217;\u0131n Hub ile kurulmu\u015f ba\u011flant\u0131s\u0131n\u0131n kopmas\u0131 neticesinde tetiklenen fonksiyondur. O anki e\u015fzamanl\u0131 etkile\u015fimde genel istatisti\u011fin elde edilmesini sa\u011flar.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        async public override Task OnDisconnectedAsync(Exception exception)\r\n        {\r\n            await Clients.All.SendAsync(&quot;userLeaved&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n<\/pre>\n<\/li>\n<\/ul>\n<blockquote><p><em style=\"color:orange;\">Ba\u011flant\u0131 olaylar\u0131 SignalR uygulamalar\u0131nda loglama i\u00e7in elveri\u015fli fonksiyonlard\u0131r.<\/em><\/p><\/blockquote>\n<h3 style=\"color:blue;\">\u00d6rnek Uygulama<\/h3>\n<p>Yukar\u0131daki gibi ilgili fonksiyonlar\u0131 override etmi\u015f olan bir SignalR hub server geli\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub\r\n    {\r\n        public async Task SendMessageAsync(string message)\r\n        {\r\n            await Clients.All.SendAsync(&quot;receiveMessage&quot;, message);\r\n        }\r\n\r\n        public async override Task OnConnectedAsync()\r\n        {\r\n            await Clients.All.SendAsync(&quot;userJoined&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n\r\n        async public override Task OnDisconnectedAsync(Exception exception)\r\n        {\r\n            await Clients.All.SendAsync(&quot;userLeaved&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan ilgili server&#8217;a uygun jQuery ile bir client tasarlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n   &lt;script src=&quot;node_modules\/@microsoft\/signalr\/dist\/browser\/signalr.min.js&quot;&gt;&lt;\/script&gt;\r\n   &lt;script src=&quot;node_modules\/jquery\/dist\/jquery.min.js&quot;&gt;&lt;\/script&gt;\r\n   &lt;script&gt;\r\n      $(document).ready(() =&gt; {\r\n         var connection = new signalR.HubConnectionBuilder()\r\n            .withUrl(&quot;https:\/\/localhost:5001\/myhub&quot;)\r\n            .build();\r\n\r\n         connection.start();\r\n\r\n         $(&quot;button&quot;).click(() =&gt; {\r\n            let message = $(&quot;#txtMessage&quot;).val();\r\n            connection.invoke(&quot;SendMessageAsync&quot;, message)\r\n               .catch(error =&gt; console.log(&quot;Mesaj g\u00f6nderilirken hata al\u0131nm\u0131\u015ft\u0131r.&quot;));\r\n         });\r\n\r\n         connection.on(&quot;receiveMessage&quot;, message =&gt; {\r\n            $(&quot;#messages&quot;).append(`${message}&lt;br&gt;`);\r\n         });\r\n\r\n         connection.on(&quot;userJoined&quot;, connectionId =&gt; {\r\n            $(&quot;div&quot;).html(`${connectionId} kat\u0131ld\u0131.`);\r\n            setTimeout(() =&gt; {\r\n               $(&quot;div&quot;).show(2000, () =&gt; {\r\n                  $(&quot;div&quot;).hide(2000);\r\n               })\r\n            }, 2000);\r\n         });\r\n\r\n         connection.on(&quot;userLeaved&quot;, connectionId =&gt; {\r\n            $(&quot;div&quot;).html(`${connectionId} ayr\u0131ld\u0131.`);\r\n            $(&quot;div&quot;).show(2000, () =&gt; {\r\n               setTimeout(() =&gt; {\r\n                  $(&quot;div&quot;).show(2000, () =&gt; {\r\n                     $(&quot;div&quot;).hide(2000);\r\n                  })\r\n               }, 2000);\r\n            })\r\n         });\r\n      });\r\n   &lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n   &lt;input type=&quot;text&quot; id=&quot;txtMessage&quot;&gt; &lt;button&gt;G\u00f6nder&lt;\/button&gt;\r\n   &lt;ul id=&quot;messages&quot;&gt;\r\n   &lt;\/ul&gt;\r\n   &lt;div style=&quot;color:darkorange;background-color: dimgrey; width: 250px; display: none;&quot;&gt;\r\n   &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Birden fazla client yap\u0131lanmas\u0131yla \u00f6rneklendirmeyi \u00e7e\u015fitlendirebilmek i\u00e7in ayn\u0131 SignalR sunucusuna ba\u011flant\u0131 sa\u011flayan benzer nitelikte bir de Console Application tasarlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static HubConnection connection;\r\n        async static Task Main(string&#x5B;] args)\r\n        {\r\n            connection = new HubConnectionBuilder().WithUrl(&quot;https:\/\/localhost:5001\/myhub&quot;).Build();\r\n            await connection.StartAsync();\r\n            Console.WriteLine(connection.State);\r\n            connection.On&lt;string&gt;(&quot;receiveMessage&quot;, message =&gt;\r\n             {\r\n                 Console.WriteLine($&quot;---&gt;{message}&quot;);\r\n             });\r\n\r\n            connection.On&lt;string&gt;(&quot;userJoined&quot;, message =&gt;\r\n            {\r\n                Console.WriteLine($&quot;{message} kat\u0131ld\u0131.&quot;);\r\n            });\r\n\r\n            connection.On&lt;string&gt;(&quot;userLeaved&quot;, message =&gt;\r\n            {\r\n                Console.WriteLine($&quot;{message} ayr\u0131ld\u0131.&quot;);\r\n                Console.WriteLine(&quot;*****************************&quot;);\r\n            });\r\n\r\n            while (true)\r\n            {\r\n                Console.WriteLine(&quot;G\u00f6nderilecek mesaj\u0131 yaz\u0131n\u0131z.&quot;);\r\n                await connection.InvokeAsync(&quot;SendMessageAsync&quot;, Console.ReadLine());\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Console uygulamas\u0131 \u00fczerinden SignalR&#8217;a nas\u0131l ba\u011flant\u0131 sa\u011fland\u0131\u011f\u0131n\u0131 t\u00fcm detaylar\u0131yla serimizin ileri ki makalelerinde ele alaca\u011f\u0131z. Keza yukar\u0131daki \u00f6rnek ilgili konuya dair yeterince detay bar\u0131nd\u0131rsada, hangi k\u00fct\u00fcphanenin y\u00fcklenmesi gerekti\u011fi, hangi s\u0131n\u0131flar\u0131n ne i\u015fe yarad\u0131\u011f\u0131 yahut hangi eventlerin kullan\u0131ld\u0131\u011f\u0131 gibi teferruatlar\u0131 de\u011ferlendirmeyi ilgili makale(ler)ye b\u0131rak\u0131yorum.<\/p>\n<h4>Test Edelim<\/h4>\n<p>T\u00fcm bu i\u015flemlerden sonra geli\u015ftirilen client uygulamalar\u0131ndan birka\u00e7 instance aya\u011fa kald\u0131ral\u0131m ve s\u00fcreci test edelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-6-Baglanti-Olaylari.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-6-Baglanti-Olaylari.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #6 - Ba\u011flant\u0131 Olaylar\u0131\" width=\"800\" height=\"486\" class=\"aligncenter size-full wp-image-17838\" \/><\/a><\/p>\n<h3 style=\"color:blue;\">T\u00fcm Client&#8217;lar\u0131 Listeleme<\/h3>\n<p>Server&#8217;a ba\u011fl\u0131 olan t\u00fcm client&#8217;lar\u0131 listeleyebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub\r\n    {\r\n        static List&lt;string&gt; clients = new List&lt;string&gt;();\r\n        public async Task SendMessageAsync(string message)\r\n        {\r\n            await Clients.All.SendAsync(&quot;receiveMessage&quot;, message);\r\n        }\r\n\r\n        public async override Task OnConnectedAsync()\r\n        {\r\n            clients.Add(Context.ConnectionId);\r\n            await Clients.All.SendAsync(&quot;clients&quot;, clients);\r\n            await Clients.All.SendAsync(&quot;userJoined&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n\r\n        async public override Task OnDisconnectedAsync(Exception exception)\r\n        {\r\n            clients.Remove(Context.ConnectionId);\r\n            await Clients.All.SendAsync(&quot;clients&quot;, clients);\r\n            await Clients.All.SendAsync(&quot;userLeaved&quot;, $&quot;{Context.ConnectionId}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki misalde g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;clients&#8217; isimli fonksiyon dinlendi\u011fi vakit sistemdeki mevcut client&#8217;lar\u0131n bilgileri elde edilebilmektedir.<\/p>\n<p>\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         connection.on(&quot;clients&quot;, clients =&gt; {\r\n            let lis = &quot;&quot;;\r\n            for (const client in clients) {\r\n               lis += `&lt;li&gt;${clients&#x5B;client]}&lt;\/li&gt;`;\r\n            }\r\n            $(&quot;#clients&quot;).html(lis);\r\n         });\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n   &lt;ul id=&quot;clients&quot;&gt;\r\n   &lt;\/ul&gt;\r\n<\/pre>\n<p>yukar\u0131daki gibi basit bir \u00e7al\u0131\u015fma neticesinde,<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-6-Baglanti-Olaylari-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-6-Baglanti-Olaylari-1.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #6 - Ba\u011flant\u0131 Olaylar\u0131\" width=\"800\" height=\"524\" class=\"aligncenter size-full wp-image-17843\" \/><\/a><br \/>\n\u015feklinde i\u015flevselli\u011fi g\u00f6zlemleyebilirsiniz.<\/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<p>Not : \u00d6rnek uygulama(lar\u0131) indirebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/SignalR-Example-Projects.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/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, SignalR mimarisi, Hub&#8217;lara yap\u0131lan ba\u011flant\u0131lar\u0131 y\u00f6netmek ve izleyebilmek i\u00e7in OnConnectedAsync ve OnDisconnectedAsync olmak \u00fczere iki adet virtual metot sunmaktad\u0131r. Bu metotlar\u0131 override ederek, bir Hub&#8217;a ba\u011fl\u0131 olan t\u00fcm client&#8217;lardan haberdar olunabilmekte ve b\u00fct\u00fcnsel&#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":17653,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3760],"tags":[3790,3791,639,3792],"class_list":["post-17825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signalr","tag-onconnectedasync","tag-ondisconnectedasync","tag-signalr","tag-signalr-baglanti-olaylari"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17825","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=17825"}],"version-history":[{"count":18,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17825\/revisions"}],"predecessor-version":[{"id":17848,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17825\/revisions\/17848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/17653"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=17825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}