1. SignalR nedir: ASP.NET SignalR, geliştirme geliştiricileri tarafından uygulamalara canlı web içeriği ekleme sürecini basitleştirmek için sunulan bir sınıf kütüphanesidir. Gerçek zamanlı web işlevselliği, sunucu kodunun istemcilerden bir talep beklemesini (içerik geri göndermeden önce) beklemek yerine, sunucu kodunun istemcilere herhangi bir zamanda içeriği aktif olarak göndermesine izin vermeyi ifade eder. Tüm "canlı" web fonksiyonları SignalR ile ASP.NET uygulamanıza eklenebilir. En yaygın kullanılan örnek sohbet odaları, ama bundan çok daha fazlasını yapabiliriz. Aşağıdaki durumları göz önünde bulundurun: kullanıcıların en güncel verileri görmek için web sayfasını sürekli yenilemeleri gerekir; Ya da uzun anket uygulayarak sayfada yeni verileri elde edebilir (ve gösterebilir), ardından bunu yapmak için SignalR kullanmayı düşünebilirsiniz. Örneğin: gösterge panelleri ve izleme uygulamaları; İşbirlikçi uygulamalar (örneğin, aynı anda birden fazla kişinin belge düzenlemesi); İş ilerleme güncellemeleri ve gerçek zamanlı sunum formları vs. SignalR, sunucudan yüksek frekanslı güncellemeler gerektiren gerçek zamanlı oyunlar gibi yeni web uygulamaları için de uygundur. İşte iyi bir örnek: ShoorR. SignalR, kullanıcıların sunucudan istemciye uzaktan işlem çağrıları (RPC) oluşturması için basit bir API sağlar ve bu çağrılar sunucu tarafından kolayca erişilebilir. Net kodu. SignalR ayrıca bağlantıları (örneğin, bağlantı ve bağlantı kesme olayları) ve bağlantı gruplamalarını içerir.
SignalR bağlantıları otomatik olarak yönetebiliyor. Ve tüm bağlı istemcilere yayın mesajları göndermenize izin veriyor, tıpkı bir sohbet odası gibi. Tabii ki, toplu göndermenin yanı sıra, belirli müşterilere mesaj da gönderebilirsiniz. İstemci ile sunucu arasındaki bağlantı, geleneksel HTTP protokolünün aksine, her iletişim için bağlantının yeniden kurulmasını gerektiren kalıcıdır. SignalR, sunucu kodu, şu anda web'de yaygın olarak kullanılan istekler yerine uzaktan prosedür çağrıları (RPC) kullanarak tarayıcıda istemci kodunu çağırabilen "sunucu push" özelliğini destekler - bu da karşılık gelen işlem modelidir. SignalR uygulamaları, Service Bus, SQL SERVER veya Redis kullanılarak binlerce istemciye genişletilebilir. SignalR açık kaynaklıdır ve GitHub üzerinden erişilebiliyor.
2. SignalR ve WebSocket
ignalR, mümkün olduğunda WebSocket taşıma yöntemini kullanır. Ve otomatik olarak eski taşıma yöntemine (örneğin HTTP uzun bağlantı) geçin. Uygulamanızı doğrudan WebSockets ile yazabilirsiniz, ancak SignalR kullanmak, tekerleği yeniden icat etmeden daha fazla işlevselliğe sahip olursunuz. En önemlisi, eski istemci için ayrı uyumlu kod oluşturmayı düşünmeden iş uygulamasına odaklanabilirsiniz. SignalR ayrıca WebSocket güncellemeleri konusunda endişelenmenize gerek kalmayacak çünkü SignalR, farklı WebSocket sürümlerindeki uygulamalar için tutarlı bir erişim arayüzü sağlamak amacıyla altta yatan taşıma yöntemlerini desteklemeye devam edecek. Elbette, sadece WebSocket taşıma kullanan bir çözüm oluşturabilirsiniz ve SignalR, kendi kodunuzu yazmanız için ihtiyacınız olabilecek tüm özellikleri sağlar; örneğin diğer taşıma yöntemlerine geri dönmek ve uygulamanızı daha yeni WebSocket uygulamaları için değiştirmek gibi.
3. Ulaşım ve dönüş
SignalR, istemci ve sunucular arasında gerçek zamanlı işlevleri uygulamak için gereken taşıma teknolojisinin soyutlamasıdır. SignalR önce bağlantıyı HTTP ile başlatır ve WebSocket'in kullanılabilir olup olmadığını kontrol eder - eğer eminseniz, WebSocket'in bağlantısına yükseltin. WebSocket, sunucu belleğini en verimli şekilde kullandığı, en düşük gecikmeye ve kapsamlı temel işlevlere (örneğin istemci ile sunucu arasında tam çiftli iletişim) sahip olduğu için SignalR için en ideal iletim yöntemidir; ayrıca en katı gereksinimlere sahiptir: sunucu Windows Server 2012 veya Windows 8 işletim sistemini kullanmalıdır ve aynı zamanda gereklidir. .NET framework sürüm 4.5 ve üzeri. Bu gereksinimler karşılanmazsa, SignalR alternatif bir iletim yöntemi kullanarak bağlantı kurmaya çalışacaktır.
4. HTML5 kargoyu
Kullanılan taşıma yöntemi, istemci tarayıcının HTML5'i destekleyip desteklemediğine bağlıdır, aksi takdirde eski taşıma yöntemi kullanılır. WebSocket (hem sunucu hem de tarayıcı WebSocket'i destekliyorsa). WebSocket, hem istemci hem de sunucu tarafında gerçek ve dayanıklı bir iki yönlü bağlantı kurmanın tek yoludur. Elbette, WebSocket en katı gereksinimlere de sahip: yalnızca IE, Chrome ve FF'nin en son sürümlerinde destekleniyor ve Opera ile Safari gibi diğer tarayıcılarda da yalnızca kısmen uygulanıyor. Sunucu, EventSource olarak da bilinen olayları gönderir (tarayıcı sunucu gönderme olaylarını destekliyorsa, IE hariç tüm tarayıcılar bu özelliği destekliyor).
5. Kuyruklu yıldız iletimi
Aşağıdaki taşıma türleri, tarayıcı veya istemcinin uzun bir HTTP bağlantı talebi tuttuğu ve sunucunun, istemci tarafından açık bir talep olmadan istemciye veri gönderebileceği Comet web uygulama modeline dayanır. Forever Frame (sadece IE) Forever Frame, tamamlanmayacak bir istek gönderen gizli bir IFrame oluşturur. Sunucu ardından sürekli olarak istemciye script gönderir ve bu betikler istemci tarafından hemen çalıştırılır; yani sunucudan istemciye tek yönlü gerçek zamanlı bir bağlantı sağlanır. İstemci-sunucu bağlantısı, o bağlantıdan farklı bir bağlantı kullanır. Örneğin, standart bir HTML isteği gönderilen her veri için yeni bir bağlantı oluşturur. Ajax uzun anketi kalıcı bir bağlantı yaratmaz, bunun yerine sürekli sunucuya talepler yaparak anketler yapar. Sunucunun yanıt vermesini bekleyip her bağlantıda bu bağlantıyı kapatın, ardından hemen yeni bir talep yapın. Tabii ki, bağlantı sıfırlanıp yeniden bağlandığında bu biraz gecikmeye yol açacaktır. Çeşitli yapılandırmaların desteklediği taşıma yöntemleri hakkında bilgi için Desteklenen Platformlar sayfasına bakınız. (IE için 8 veya üzeri gerekiyor, diğer tarayıcılar mevcut sürüm -1) Transfer yöntemi seçme süreci Aşağıdaki liste, SignalR'nin iletim için hangi tipi kullanacağına nasıl karar verdiğini göstermektedir. IE8 ve önceki modellerde uzun anket kullanın. JSONP yapılandırılmışsa (yani bağlanırken jsonp parametresi true olarak ayarlanmışsa), uzun anket kullanın. Eğer çapraz bir bağlantı kullanıyorsanız (yani SignalR uç noktası ve sayfa aynı alanda değilse), aşağıdaki koşullar karşılanırsa WebSockets kullanın: İstemci Alanlar Arası Kaynak Paylaşımını (CORS) destekler, ayrıntılar için CORS'a bakınız İstemci WebSocket'i destekler Sunucu WebSocket'i destekler Yukarıdaki koşullardan herhangi biri karşılanmazsa, uzun bir anket kullanılır. Alanlar arası bağlantılar hakkında daha fazla bilgi için bkz. Alanlar arası bağlantılar nasıl kurulur. JSONP kullanımını yapılandırmazsanız ve bağlantı alanlar arası değilse, elbette hem istemci hem de sunucu WebSocket'i desteklediği sürece WebSocket kullanın. İstemci veya sunucu WebSocket'leri desteklemiyorsa, sunucuyu olay göndermek için kullanın. Sunucu bir olay gönderirse uygun değilse, Forever Frame kullanın. Forever Frame mevcut değilse, uzun anket kullanın. Monitör iletimi Uygulamanızın hangi taşıma yöntemini kullandığını Hub log'unu etkinleştirerek ve tarayıcınızın konsolunda görebilirsiniz. Loglamayı etkinleştirmek için istemci uygulamasına aşağıdaki komutu ekleyin: nnection.hub.logging = doğru;
6. Denetim ve taşıma:
Uygulamanızın hangi taşıma yöntemini kullandığını Hub log'unu etkinleştirerek ve tarayıcınızın konsolunda görebilirsiniz. Loglamayı etkinleştirmek için istemci uygulamasına aşağıdaki komutu ekleyin: nnection.hub.logging = doğru; $.connection.hub.logging = doğru; IE'de geliştirici araçlarını açmak için F12 tuşuna basın ve Konsol sekmesine tıklayın.
Chrome'da, konsolu açmak için Ctrl+Shift+J tuşlarına basın
Konsoldaki kayıt işlemlerini gözlemleyerek SignalR'ın kullandığı iletim yöntemini görebilirsiniz.
7. Belirlenmiş Nakliye Sistemi:
İletim yöntemini müzakere etmek belirli bir zaman ve sunucu/istemcinin kaynaklarını gerektirir. İstemci ortamı biliniyorsa, bağlantı başlatıldığında taşıma yöntemi belirtilebilir ve performansı artırmak sağlanır. Aşağıdaki kod, istemcinin başka herhangi bir protokolü desteklediği biliniyorsa, bağlantı başlatma anında Ajax'ın uzun anketinin doğrudan kullanıldığını gösterir: connection.start({ taşıma: 'longPolling' }); Bir müşterinin nakliyatı belirli bir sırayla müzakere etmesini istiyorsanız, müzakerenin hangi sırada yapılacağını belirtebilirsiniz. Aşağıdaki kod, önce WebSocket kullanmayı denemeyi ve başarısızlıktan hemen sonra uzun anket yapmayı nasıl kullanacağını gösteriyor. connection.start({ taşıma: ['webSockets','longPolling'] }); Kullanıcı tarafından belirtilen dizi sabitleri aşağıdaki şekilde tanımlanır: webSockets forverFrame serverSentEvents longPolling
8. Bağlantılar ve Merkezler SignalR API, iki istemci-sunucu iletişim modeli içerir: kalıcı bağlantılar ve hublar.
Bağlantı, tek, gruplanmış veya yayın mesajı göndermek için basit bir uç noktayı temsil eder. PersistentConnection API'si (.NET kodunda PersistentConnection sınıfı ile temsil edilir) geliştiricilere SignalR'in temel iletişim protokolüne doğrudan erişim sağlar. WCF gibi bağlantı tabanlı API'leri kullanmış geliştiriciler, bağlantı iletişim modeline daha aşina olacaklardır. Hub'lar, istemci ve sunucuların doğrudan birbirlerine metod çağırmasına olanak tanıyan API tabanlı ancak daha yüksek seviyeli iletişim hatlarıdır. SignalR, makineler arası zamanlamada harika bir iş çıkarıyor; müşterilerin sunucudaki metodları yerel metodları çağırıyormuş gibi kolayca çağırmasına olanak tanıyor ve tam tersi de oluyor. .Net Remoting gibi uzaktan çağrı tabanlı AIP'leri kullanmış geliştiriciler, hub modeline daha aşina olacaklardır. Hub kullanılarak, güçlü tipli parametreleri metodlara geçirip modele bağlayabilirsiniz.
Mimari diyagram: Aşağıdaki diyagram, hub, sürekli bağlantı ve ulaşım için kullanılan temel teknoloji arasındaki ilişkiyi göstermektedir.
9. Hub nasıl çalışır:
Sunucu kodu istemciyi çağırdığında, sunucu çağrı yöntemi ve parametreleri içeren bir paket gönderir (nesne metod parametresi olarak kullanıldığında, gönderilmek üzere JSON olarak serileştirilir). İstemci daha sonra alınan metod adını kontrol eder ve istemci tanımlı yöntemde bir eşleşme araması yapar; eşleşme başarılı olursa, yöntem çalıştırılır ve serilikten çıkarılan nesne yöntem parametresi olarak kullanılır. Fiddler gibi araçları kullanarak metod çağrısı yürütülmesini izleyebilirsiniz. Aşağıdaki görsel, Fiddler'ın günlüklerinden alınan ve SignalR sunucusundan web tarayıcı istemcisine gönderilecek bir yöntemi göstermektedir. Hub'dan başlatılan yöntem MoveShapeHub olarak adlandırılır ve bu yöntem updateShape olarak adlandırılır.
Bu örnekte, hub'un adı "H" parametresiyle, metod adı "M" parametresiyle, metoda gönderilen parametre nesnesi ise "A" parametresi ile tanımlanır. Mesajı üreten uygulama, yüksek frekanslı gerçek zamanlı iletişim eğitiminde uygulandı. Bir iletişim modeli seçin: Çoğu uygulama, merkezin API'sini kullanır ve bu API, aşağıdaki durumlarda kullanılabilir: Mesajın gönderildiği formatı belirtmeniz gerekir. Geliştiriciler, uzaktan arama modeli yerine mesajlaşma ve zamanlama modeli kullanmayı tercih ederler Mesajlaşma modeli mevcut uygulamalarda kullanılmakta ve SignalR'e taşınması planlanıyor.
|