﻿
{"id":17716,"date":"2020-09-05T11:26:29","date_gmt":"2020-09-05T11:26:29","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17716"},"modified":"2020-09-05T11:26:29","modified_gmt":"2020-09-05T11:26:29","slug":"asp-net-core-signalr-serisi-2-signalr-server-uygulamasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-serisi-2-signalr-server-uygulamasi\/","title":{"rendered":"Asp.NET Core &#8211; SignalR Serisi #2 &#8211; SignalR Server Uygulamas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-yazi-serisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">SignalR Yaz\u0131 Serisi<\/a>nin bu ikinci makalesinde SignalR&#8217;\u0131n server taraf\u0131n\u0131n nas\u0131l in\u015fa edildi\u011fini ve aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<div id=\"attachment_17653\" style=\"width: 510px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/signalr.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-17653\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/signalr.png\" alt=\"\" width=\"500\" height=\"608\" class=\"size-full wp-image-17653\" \/><\/a><p id=\"caption-attachment-17653\" class=\"wp-caption-text\">\u015eimdi, her\u015feyden \u00f6nce yukar\u0131daki g\u00f6rseli incelersek e\u011fer SignalR uygulamas\u0131n\u0131n client ile server aras\u0131ndaki ili\u015fkiden ibaret oldu\u011funu ve ilk etapta server&#8217;\u0131n in\u015fa edilip ard\u0131ndan ona uygun client tasar\u0131m\u0131n\u0131n yap\u0131lmas\u0131 gerekti\u011fini s\u00f6yleyebiliriz. O y\u00fczden bu makalemizde server&#8217;\u0131n in\u015fas\u0131n\u0131 ele alacak, bir sonraki i\u00e7eri\u011fimizde ise bu server&#8217;a uygun client tasar\u0131m\u0131n\u0131n nas\u0131l olaca\u011f\u0131n\u0131 konu\u015faca\u011f\u0131z.<\/p><\/div>\n<h3 style=\"color: #e83e8c;\">SignalR Server Uygulamas\u0131n\u0131 Olu\u015ftural\u0131m<\/h3>\n<p>SignalR server uygulamas\u0131n\u0131 olu\u015fturabilmek i\u00e7in Visual Studio edit\u00f6r\u00fc \u00fczerinden bir Asp.NET Core &#8211; Web API yahut MVC uygulamas\u0131n\u0131n olu\u015fturulmas\u0131 yeterli olacakt\u0131r ve ekstradan bir k\u00fct\u00fcphanenin y\u00fcklenmesine gerek kalmaks\u0131z\u0131n SignalR direkt olarak uygulama \u00fczerinde konfig\u00fcre edilebilir vaziyette dahili gelecektir.<\/p>\n<p>Bizler pratiksel a\u00e7\u0131dan \u00f6rneklendirmeye Asp.NET Core &#8211; Web API \u00fczerinden devam edece\u011fiz. Bu temel haz\u0131rl\u0131ktan sonra ad\u0131m ad\u0131m a\u015fa\u011f\u0131daki \u00f6nergeleri uygulay\u0131n\u0131z;<\/p>\n<ul>\n<li><strong>Ad\u0131m 1<\/strong><br \/>\nSignalR&#8217;\u0131n kalbinde &#8216;Hub&#8217; dedi\u011fimiz merkezi yap\u0131lar var demi\u015ftik. Client ile server aras\u0131ndaki t\u00fcm veri ak\u0131\u015f\u0131 bu hub&#8217;lar \u00fczerinden ger\u00e7ekle\u015ftirilmektedir. \u00d6z\u00fcnde hub&#8217;lar birer class&#8217;t\u0131r. Bu y\u00fczden bu class&#8217;lar\u0131n uygun yerde tutulmas\u0131 proje tasar\u0131m\u0131 a\u00e7\u0131s\u0131ndan zaruridir. Bunun i\u00e7in uygulaman\u0131n ana dizininde &#8216;Hubs&#8217; isminde bir klas\u00f6r olu\u015fturularak i\u015fe ba\u015flanabilir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-SignalR-Serisi-2-SignalR-Server-Uygulamasi.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-SignalR-Serisi-2-SignalR-Server-Uygulamasi.jpg\" alt=\"Asp.NET Core - SignalR Serisi #2 - SignalR Server Uygulamas\u0131\" width=\"211\" height=\"176\" class=\"aligncenter size-full wp-image-17729\" \/><\/a><br \/>\nOlu\u015fturulan klas\u00f6r i\u00e7erisine hub&#8217;lar\u0131m\u0131z\u0131 olu\u015fturaca\u011f\u0131z. Bizler \u00f6rneklendirme a\u00e7\u0131s\u0131ndan &#8216;MyHub&#8217; isminde bir class eklemi\u015f bulunmaktay\u0131z.\n<\/li>\n<li><strong>Ad\u0131m 2<\/strong><br \/>\nBir class&#8217;\u0131n hub olabilmesi i\u00e7in <em style=\"color:orange;\">Microsoft.AspNetCore.SignalR<\/em> k\u00fct\u00fcphanesindeki &#8216;Hub&#8217; s\u0131n\u0131f\u0131ndan t\u00fcremesi laz\u0131md\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub\r\n    {\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte oldu\u011fu gibi &#8216;MyHub&#8217; s\u0131n\u0131f\u0131 &#8216;Hub&#8217;tan t\u00fcretildi\u011fi i\u00e7in art\u0131k bir hub s\u0131n\u0131f\u0131 olmu\u015ftur. Dolay\u0131s\u0131yla bu s\u0131n\u0131f client taraf\u0131ndan tetiklendi\u011finde SignalR mekanizmas\u0131 sayesinde server&#8217;\u0131n da client&#8217;\u0131 tetiklemesini sa\u011flayacakt\u0131r.\n<\/li>\n<li><strong>Ad\u0131m 3<\/strong><br \/>\n&#8216;MyHub&#8217; s\u0131n\u0131f\u0131n\u0131n i\u00e7erisine client&#8217;lara bilgi\/veri\/mesaj g\u00f6nderebilmesi i\u00e7in bir metot olu\u015fturulmas\u0131 gerekmektedir. Bizler \u015fimdilik bu metoda &#8216;SendMessage&#8217; ismini verebiliriz.<\/p>\n<p>Bunun i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyiniz;<\/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<\/pre>\n<p>&#8216;SendMessageAsync&#8217; metodu tetiklendi\u011finde &#8216;<em>Clients<\/em>&#8216; property&#8217;si \u00fczerinden &#8216;receiveMessage&#8217; isimli metoda subscribe\/abone olan &#8216;<em>All<\/em>&#8216; yani t\u00fcm client&#8217;lara ilgili mesaj g\u00f6nderilecektir.<\/p>\n<p>Burada &#8216;Clients&#8217; property&#8217;sine dikkatinizi \u00e7ekmek istiyorum. Bu property, &#8216;Hub&#8217; base class&#8217;\u0131ndan gelmekte ve bilgi trafi\u011finde client&#8217;lar\u0131 temsil etmektedir. &#8216;Clients.All&#8217; komutu ise ad\u0131 \u00fczerinde t\u00fcm client&#8217;lara kar\u015f\u0131l\u0131k gelmektedir. SignalR mekanizmas\u0131, &#8216;SendAsync&#8217; fonksiyonu i\u00e7erisinde tan\u0131mlanm\u0131\u015f olan de\u011fere kar\u015f\u0131l\u0131k(receiveMessage) client&#8217;lar da subscribe olunan bir metot beklemekte ve hub \u00fczerinden &#8216;SendMessageAsync&#8217;e herhangi bir tetikleme oldu\u011fu vakit direkt olarak client&#8217;lar\u0131 da ilgili fonksiyon \u00fczerinden bilgilendirmektedir.\n<\/li>\n<li><strong>Ad\u0131m 4<\/strong><br \/>\nT\u00fcm bu i\u015flemler neticesinde &#8216;Startup.cs&#8217; dosyas\u0131na a\u015fa\u011f\u0131daki konfig\u00fcrasyonlar\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddControllers();\r\n            services.AddSignalR();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n            {\r\n                app.UseDeveloperExceptionPage();\r\n            }\r\n\r\n            app.UseRouting();\r\n\r\n            app.UseEndpoints(endpoints =&gt;\r\n            {\r\n                endpoints.MapControllers();\r\n                endpoints.MapHub&lt;MyHub&gt;(&quot;\/myhub&quot;);\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki ayarlara g\u00f6z atarsan\u0131z e\u011fer yap\u0131lmas\u0131 gereken sadece &#8216;ConfigureServices&#8217; i\u00e7erisinde <em><strong>6.<\/strong><\/em> sat\u0131rda oldu\u011fu gibi &#8216;AddSignalR&#8217; servisini \u00e7a\u011f\u0131rmak ve &#8216;Configure&#8217; i\u00e7erisinde ise <em><strong>21.<\/strong><\/em> sat\u0131rdaki gibi tasarlanan hub&#8217;un endpoint&#8217;ini ayarlamakt\u0131r. Burada tan\u0131mlanan endpoint <code style=\"color:red;\"><strong>'https:\/\/localhost:5001\/myhub'<\/strong><\/code> \u015feklinde olacakt\u0131r.\n<\/li>\n<\/ul>\n<blockquote><p><em style=\"color:blue;\">Client taraf\u0131ndan Hub&#8217;a g\u00f6nderilen her bir istek neticesinde ilgili s\u0131n\u0131ftan yeni bir nesne olu\u015fturulacakt\u0131r. Dolay\u0131s\u0131yla global tan\u0131mlanan t\u00fcm property yahut field&#8217;lar\u0131n <u>static<\/u> tan\u0131mlanmas\u0131 gerekmektedir.<\/em><\/p><\/blockquote>\n<p>\u0130\u015fte bu kadar basit&#8230; SignalR&#8217;da en sade haliyle bir hub&#8217;\u0131 a\u011faya kald\u0131rmak bu kadar sade ve kolayd\u0131r. Bir sonraki i\u00e7eri\u011fimizde konumuz, tan\u0131mlad\u0131\u011f\u0131m\u0131z bu server ile ileti\u015fim kuran client tasar\u0131m\u0131 olacakt\u0131r.<\/p>\n<p>O halde siz bu makaleyi okurken bende sonraki makalenin ilk m\u00fcrekkeplerini ak\u0131tmaya ba\u015flamak \u00fczere noktay\u0131 koyuyorum&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#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\/SignalRExample.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 Yaz\u0131 Serisinin bu ikinci makalesinde SignalR&#8217;\u0131n server taraf\u0131n\u0131n nas\u0131l in\u015fa edildi\u011fini ve aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131n\u0131 inceleyece\u011fiz. SignalR Server Uygulamas\u0131n\u0131 Olu\u015ftural\u0131m SignalR server uygulamas\u0131n\u0131 olu\u015fturabilmek i\u00e7in Visual Studio edit\u00f6r\u00fc \u00fczerinden bir Asp.NET Core &#8211;&#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":[3770,639,3767,3769,3768],"class_list":["post-17716","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signalr","tag-microsoft-aspnetcore-signalr","tag-signalr","tag-signalr-server","tag-signalr-server-olusturma","tag-signalr-server-uygulamasi"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17716","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=17716"}],"version-history":[{"count":28,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17716\/revisions"}],"predecessor-version":[{"id":17746,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17716\/revisions\/17746"}],"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=17716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}