﻿
{"id":17800,"date":"2020-09-10T20:10:46","date_gmt":"2020-09-10T20:10:46","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17800"},"modified":"2020-09-10T20:10:46","modified_gmt":"2020-09-10T20:10:46","slug":"asp-net-core-signalr-serisi-5-clientda-otomatik-baglanti-konfigurasyonu-ve-durum-fonksiyonlari","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-serisi-5-clientda-otomatik-baglanti-konfigurasyonu-ve-durum-fonksiyonlari\/","title":{"rendered":"Asp.NET Core \u2013 SignalR Serisi #5 \u2013 Client&#8217;da Otomatik Ba\u011flant\u0131 Konfig\u00fcrasyonu ve Durum Fonksiyonlar\u0131(jQuery)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>SignalR vas\u0131tas\u0131yla client ile server aras\u0131nda e\u015fzamanl\u0131 bir etkile\u015fim sa\u011flanmaya \u00e7al\u0131\u015f\u0131l\u0131rken, ilk etapta bir ba\u011flant\u0131n\u0131n olmamas\u0131 yahut var olan ba\u011flant\u0131n\u0131n s\u00fcre\u00e7 i\u00e7erisinde kopmas\u0131 durumlar\u0131na istinaden bu ba\u011flant\u0131n\u0131n yeniden veya ilk olarak belli aral\u0131klarla sa\u011flanmaya \u00e7al\u0131\u015f\u0131lmas\u0131 gerekmektedir. Bir yandan bu ba\u011flant\u0131 ger\u00e7ekle\u015ftirme s\u00fcre\u00e7lerinde, ba\u011flant\u0131n\u0131n durumu hakk\u0131nda bilgi edinebilmek i\u00e7in tasarlanm\u0131\u015f olaylar devreye sokularak, kullan\u0131c\u0131y\u0131 y\u00f6nlendirmemiz gerekebilmektedir. \u0130\u015fte bu i\u00e7eri\u011fimizde, bu ihtiya\u00e7lar do\u011frultusunda otomatik ba\u011flant\u0131 konfig\u00fcrasyonunun nas\u0131l ger\u00e7ekle\u015ftirilece\u011fi, ba\u011flant\u0131 durumu hakk\u0131nda bilgi veren event&#8217;lerin neler oldu\u011fu ve nas\u0131l tan\u0131mland\u0131\u011f\u0131 hakk\u0131nda jQuery \u00fczerinden detayl\u0131 incelemede bulunaca\u011f\u0131z.<\/p>\n<h3 style=\"color: #e83e8c;\">Otomatik Ba\u011flant\u0131 Konfig\u00fcrasyonu<\/h3>\n<p>Otomatik ba\u011flant\u0131 konfig\u00fcrasyonu; ilk etapta bir ba\u011flant\u0131n\u0131n olmad\u0131\u011f\u0131 veya ba\u011flant\u0131n\u0131n s\u00fcre\u00e7 i\u00e7erisinde koptu\u011fu durumlar\u0131na istinaden \u00f6zel olarak yap\u0131land\u0131r\u0131labilir. \u0130lk olarak ba\u011flant\u0131n\u0131n s\u00fcre\u00e7 i\u00e7erisinde koptu\u011fu durumlarda otomatik ba\u011flant\u0131 konfig\u00fcrasyonunu ele alal\u0131m. Bunun i\u00e7in <code style=\"color:red;\"><strong>withAutomaticReconnect<\/strong><\/code> fonksiyonu kullan\u0131lmaktad\u0131r.<\/p>\n<p>withAutomaticReconnect; e\u015fzamanl\u0131 etkile\u015fime girmi\u015f olan client ile server aras\u0131ndaki ba\u011flant\u0131n\u0131n s\u00fcre\u00e7 esnas\u0131nda kopmas\u0131 sonucu tekrar ba\u011flan\u0131lmas\u0131n\u0131 sa\u011flayan bir fonksiyondur. Ba\u011flant\u0131 koptuktan sonra s\u0131ras\u0131yla <strong><em>0<\/em><\/strong> -> <strong><em>2<\/em><\/strong> -> <strong><em>10<\/em><\/strong> -> <strong><em>30<\/em><\/strong> saniyelik periyotlarla d\u00f6rt kez tekrarl\u0131 bir \u015fekilde ba\u011flant\u0131y\u0131 deneyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         var connection = new signalR.HubConnectionBuilder()\r\n            .configureLogging(signalR.LogLevel.Information)\r\n            .withUrl(&quot;https:\/\/localhost:5001\/myhub&quot;)\r\n            .withAutomaticReconnect()\r\n            .build();\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #5 \u2013 Client&#039;da Otomatik Ba\u011flant\u0131 Konfig\u00fcrasyonu ve Durum Fonksiyonlar\u0131(jQuery)\" width=\"800\" height=\"315\" class=\"aligncenter size-full wp-image-17807\" \/><\/a><br \/>\nYukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi bu denemelerden herhangi birinde ba\u011flant\u0131 sa\u011flan\u0131yorsa uygulama i\u015flevine sa\u011fl\u0131kl\u0131 bir \u015fekilde devam edecektir.<\/p>\n<p>withAutomaticReconnect&#8217;in parametresi \u00fczerinden verilen dizisel de\u011ferler ile tekrardan deneme periyodu belirlenerek, \u00f6zelle\u015ftirilebilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         var connection = new signalR.HubConnectionBuilder()\r\n            .configureLogging(signalR.LogLevel.Information)\r\n            .withUrl(&quot;https:\/\/localhost:5001\/myhub&quot;)\r\n            .withAutomaticReconnect(&#x5B;1000, 1000, 2000, 3000, 5000, 1000, 100, 100])\r\n            .build();\r\n<\/pre>\n<p>Yukar\u0131daki tan\u0131mlamaya g\u00f6z atarsan\u0131z e\u011fer s\u00fcre\u00e7te ba\u011flant\u0131n\u0131n kopmas\u0131 durumunda s\u0131ras\u0131yla <em><strong>1 saniye<\/strong><\/em> -> <em><strong>1 saniye<\/strong><\/em> -> <em><strong>2 saniye<\/strong><\/em> -> <em><strong>3 saniye<\/strong><\/em> -> <em><strong>5 saniye<\/strong><\/em> -> <em><strong>1 saniye<\/strong><\/em> -> <em><strong>100 milisaniye<\/strong><\/em> -> <em><strong>100 milisaniye<\/strong><\/em> aral\u0131klar\u0131yla tekrar ba\u011flant\u0131 denenmi\u015f olacakt\u0131r.<\/p>\n<p>\u0130kinci olarak ilk etapta ba\u011flant\u0131n\u0131n olmad\u0131\u011f\u0131 durumdaki otomatik ba\u011flant\u0131 konfig\u00fcrasyonunu ele alal\u0131m. Buna el ile yeniden ba\u011flant\u0131 yahut manuel yeniden ba\u011flant\u0131da diyebiliriz. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         async function start() {\r\n            try {\r\n               await connection.start()\r\n            } catch (error) {\r\n               setTimeout(() =&gt; start(), 2000);\r\n            }\r\n         }\r\n\r\n         start();\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer connection nesnesinin &#8216;start&#8217; fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda herhangi bir hata f\u0131rlat\u0131l\u0131yorsa e\u011fer ak\u0131\u015f catch&#8217;e d\u00fc\u015fecek ve 2000 saniye sonra yeniden bir ba\u011flant\u0131 ger\u00e7ekle\u015ftirilmeye \u00e7al\u0131\u015f\u0131lacakt\u0131r ve bu i\u015flem ba\u015far\u0131l\u0131 oluncaya kadar devam edecektir.<\/p>\n<p>\u0130lgili \u00e7al\u0131\u015fma benzer mant\u0131kla a\u015fa\u011f\u0131daki gibi de kodlanabilir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         function start() {\r\n            connection.start().then(() =&gt; { }).catch(error =&gt; setTimeout(() =&gt; start(), 2000))\r\n         }\r\n\r\n         start();\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery-1.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #5 \u2013 Client&#039;da Otomatik Ba\u011flant\u0131 Konfig\u00fcrasyonu ve Durum Fonksiyonlar\u0131(jQuery)\" width=\"800\" height=\"372\" class=\"aligncenter size-full wp-image-17811\" \/><\/a><\/p>\n<h3 style=\"color: #e83e8c;\">Durum Fonksiyonlar\u0131<\/h3>\n<p>Durum fonksiyonlar\u0131, client ile server aras\u0131ndaki ba\u011flant\u0131n\u0131n ger\u00e7ekle\u015fme durumuna g\u00f6re f\u0131rlat\u0131lan event&#8217;lerdir. <strong><em>onreconnecting<\/em><\/strong>, <strong><em>onreconnected<\/em><\/strong> ve <strong><em>onclose<\/em><\/strong> olmak \u00fczere \u00fc\u00e7 adettir.<\/p>\n<ul>\n<li><strong><em>onreconnecting<\/em><\/strong><br \/>\nYeniden ba\u011flanma giri\u015fimlerini ba\u015flatmadan \u00f6nce f\u0131rlat\u0131lan event&#8217;tir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         connection.onreconnecting(error =&gt; {\r\n            console.assert(connection.state === signalR.HubConnectionState.Reconnecting);\r\n            console.log(&quot;Ba\u011flant\u0131 ger\u00e7ekle\u015ftiriliyor.&quot;)\r\n         });\r\n<\/pre>\n<\/li>\n<li><strong><em>onreconnected<\/em><\/strong><br \/>\nYeniden ba\u011flant\u0131 ger\u00e7ekle\u015ftirildi\u011finde f\u0131rlat\u0131l\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         connection.onreconnected(connecitonid =&gt; {\r\n            console.assert(connection.state === signalR.HubConnectionState.Connected);\r\n            console.log(&quot;Ba\u011flant\u0131 ger\u00e7ekle\u015ftirildi.&quot;)\r\n         });\r\n<\/pre>\n<p>Burada ba\u011flant\u0131 ger\u00e7ekle\u015ftiren client&#8217;a di\u011ferlerinden ay\u0131rmak i\u00e7in server taraf\u0131ndan bir connectionid verilmektedir.\n<\/li>\n<li><strong><em>onclose<\/em><\/strong><br \/>\nYeniden ba\u011flant\u0131 giri\u015fimlerinin sonu\u00e7suz kald\u0131\u011f\u0131 durumda f\u0131rlat\u0131l\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         connection.onclose(connecitonid =&gt; {\r\n            console.assert(connection.state === signalR.HubConnectionState.Disconnected);\r\n            console.log(&quot;Ba\u011flant\u0131 ger\u00e7ekle\u015ftirilemedi.&quot;)\r\n         });\r\n<\/pre>\n<\/li>\n<\/ul>\n<h4 style=\"color: orange;\">\u00d6rnek Yapal\u0131m<\/h4>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n\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            .configureLogging(signalR.LogLevel.Information)\r\n            .withUrl(&quot;https:\/\/localhost:5001\/myhub&quot;)\r\n            .withAutomaticReconnect(&#x5B;1000, 1000, 1000, 1000])\r\n            .build();\r\n         function start() {\r\n            connection.start().then(() =&gt; { }).catch(error =&gt; setTimeout(() =&gt; start(), 2000))\r\n         }\r\n         start();\r\n         connection.onreconnecting(error =&gt; {\r\n            $(&quot;div&quot;).css(&quot;background-color&quot;, &quot;#6286a0&quot;);\r\n            $(&quot;div&quot;).css(&quot;color&quot;, &quot;#white&quot;);\r\n            $(&quot;div&quot;).html(&quot;Ba\u011flan\u0131l\u0131yor&quot;)\r\n         });\r\n         connection.onreconnected(connecitonid =&gt; {\r\n            $(&quot;div&quot;).css(&quot;background-color&quot;, &quot;#32a838&quot;);\r\n            $(&quot;div&quot;).css(&quot;color&quot;, &quot;#white&quot;);\r\n            $(&quot;div&quot;).html(&quot;Ba\u011fland\u0131&quot;)\r\n         });\r\n         connection.onclose(connecitonid =&gt; {\r\n            $(&quot;div&quot;).css(&quot;background-color&quot;, &quot;red&quot;);\r\n            $(&quot;div&quot;).css(&quot;color&quot;, &quot;#white&quot;);\r\n            $(&quot;div&quot;).html(&quot;Ba\u011flan\u0131lamad\u0131&quot;)\r\n         });\r\n      });\r\n   &lt;\/script&gt;\r\n   &lt;style&gt;\r\n      div {\r\n         background-color: #6286a0;\r\n         border: 15px solid rgba(255, 255, 255, .5);\r\n         border-radius: 115px;\r\n         width: 80px;\r\n         height: 80px;\r\n         line-height: 80px;\r\n         font-size: 12px;\r\n         color: white;\r\n         font-family: Arial, Helvetica, sans-serif;\r\n         font-weight: bold;\r\n         text-shadow: #2d4251 5px 5px 5px;\r\n      }\r\n   &lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n   &lt;div&gt;&lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-5-\u2013-Clientda-Otomatik-Baglanti-Konfigurasyonu-ve-Durum-FonksiyonlarijQuery-2.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #5 \u2013 Client&#039;da Otomatik Ba\u011flant\u0131 Konfig\u00fcrasyonu ve Durum Fonksiyonlar\u0131(jQuery)\" width=\"800\" height=\"771\" class=\"aligncenter size-full wp-image-17820\" \/><\/a><\/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 uygulamay\u0131 indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/SignalRExampleUI-2.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 vas\u0131tas\u0131yla client ile server aras\u0131nda e\u015fzamanl\u0131 bir etkile\u015fim sa\u011flanmaya \u00e7al\u0131\u015f\u0131l\u0131rken, ilk etapta bir ba\u011flant\u0131n\u0131n olmamas\u0131 yahut var olan ba\u011flant\u0131n\u0131n s\u00fcre\u00e7 i\u00e7erisinde kopmas\u0131 durumlar\u0131na istinaden bu ba\u011flant\u0131n\u0131n yeniden veya ilk olarak belli aral\u0131klarla&#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":[3789,3788,3787,639,3784,3785,3786],"class_list":["post-17800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signalr","tag-onclose","tag-onreconnected","tag-onreconnecting","tag-signalr","tag-signalr-otomatik-baglanti","tag-signalr-reconnect","tag-withautomaticreconnect"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17800","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=17800"}],"version-history":[{"count":19,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17800\/revisions"}],"predecessor-version":[{"id":17823,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17800\/revisions\/17823"}],"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=17800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}