Tunahan Özcan

Tunahan Özcan

Fashion

Welcome to my blog

January 20, 2018

Bu yazıda server ile client arasında tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan bir bilgisayar iletişim protokollerinden biri olan SignalR ve Service Broker kütüphanelerinden SqlTableDependency paketini kullanarak dinamik grafik örneği oluşturacağız. Not: Temel SignalR bağlantılarının bilindiğini varsayarak o kısımda detaya girmeyeceğiz.

Projenin server tarafında .Net Core 5,

Client tarafında jQuery,

Veri tabanı olarak Northwind veri tabanını kullanıyor olacağız.

İlk etapta projemizin server kısmına “SqlTableDependency” kütüphanesini ekliyoruz ve database bağlantı servisini yazıyoruz.

Bu kısımda SqlTableDependency bizden parametre olarak connection string ve tablo ismi istiyor. Connection stringi appsettings üzerinden almak için IConfiguration interface ini implemente ediyoruz. Tablo ismini Startup kısmında Middleware oluşturarak alacağımız tablo ismini parametre olarak göndereceğiz.

SqlTableDependency nesnesini oluşturduktan sonra OnChanged ve OnError eventlerini yazıyoruz. Bunlar veri tabanında değişiklik olduğunda veya hata alma durumunda tetiklenecek olan eventler ve (object sender, TableDependency.SqlClient.Base.EventArgs.RecordChangedEventArgs<T> e) şeklinde iki parametreye sahipler. TableDependency mizin tanımlamalarını yaptıktan sonra .Start() diyerek başlatıyoruz. Durdurmayı ise üretilen nesnenin imha edildiği destructor kısmında yapıyoruz.

Startup kısmında ise, services.AddSingleton<DatabaseSubscription<Order>>(); servisini singleton olarak ekliyoruz. Burada singleton olarak eklememizin sebebi uygulama başlatıldıktan sonra bitene kadar üretilen nesnenin ayakta kalabilmesi için. Scope veya transient olarak eklersek kalıcılık özelliği göstermeyeceğinden dolayı ilgili tablolardaki değişiklikleri takip edemeyiz.

Middleware katmanının oluşturulması;

Proje build edilirken belirtilen sql tablosunun tabledependency tarafından dinlenmeye başlamasını sağlıyoruz.

Startup kısmında ise,

app.UseDatabaseSubscription<DatabaseSubscription<Order>>(“Orders”);

Veri tabanından takip ettiğimiz tablo üzerinde değişiklik yapıyoruz ve yaptığımız değişikliği kod tarafında yakalayabildiğimizi görüyoruz.

Veri tabanındaki değişiklikleri istediğimiz gibi yakalayabildiğimize göre şimdi sistemimize SignalR sistemini implemente edip elde ettiğimiz dataların client tarafına aktarımını yapalım.

SignalR bağlantısının yapılması;

İlk olarak projemizde Hub interfacesinden implemente edilen bir hub sınıfı oluşturuyoruz. (Örn: public class siparisHub:Hub)

Startup kısmında ise,

servislere SignalR ve client tarafından yapılacak isteklerde hata alınmaması için CORS politikalarını tanımlıyoruz ve endpoint ekliyoruz.

use cors u routingten önce yazdığınızdan emin olun.

Veri tabanındaki değişikliklerin Web Socket ile bağlı olan clientlara gönderilmesi;

Önceden oluşturduğumuz tableDependency servisimizde tabloda değişiklik olursa client tarafında tetiklenecek olan fonksiyonu ve göndermek istediğimiz dataları tanımlıyoruz. Burada signalR ile hub işlemlerini yapabilmek için IHubContext ile oluşturduğumuz hub sınıfımızı ekliyoruz. Db den Linq sorgu ile client tarafında yapacağımız grafiğe göre verileri çekiyoruz. Sonrasında Northwind veri tabanındaki orders tablosunda yer alan verileri, çalışan ve toplam navlun şeklinde derleyip clientlara gönderdik.

Client tarafında basit bir html dosyası oluşturup içerisine sırayla signalr, jquery ve grafik için gerekli script dosyalarını ekliyoruz. connection.on ile server tarafından tetiklenen fonksiyonun içerisinde grafik için gerekli olan verileri ekliyoruz. Her seferinde eklemeden önce grafikteki değerleri siliyoruz ki çoklama olmasın.

Sıra geldi sql tarafında Orders tablosunda değişiklik yaparak grafiği, sayfayı yenilemeden dinamik bir şekilde değişip değişmediğini kontrol etmede.

Turuncu renkteki Steven isimli çalışanın oluşturduğu siparişlerden birinde değeri yükseltiyoruz ve grafik dinamik olarak güncelleniyor.

Sonuç başarılı.

Dökümanın kaynak kodlarına github hesabımdan erişebilirsiniz.

https://github.com/tunahanozcan/Web_Socket_Service_Broker

Not: Sql Table Dependency kütüphanesini maalesef View ve join ile birleştirilmiş sorgularda kullanamıyoruz. Eğer grafiğinizde bu şekilde birden fazla tablo ile bağlantılı veri varsa kod tarafında düzenleme yaparak client tarafına o şekilde göndermeniz gerekmektedir.

Sql Table Dependency kütüphanesinin github sayfası;

https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency

Post Comments

  • Reply
    Jane Doe
    June 10, 2018 at 5:39 am

    Nice blog.

Leave A Reply