SignalR'ye giriş

tarafından Patrick Fletcher

Uyarı

Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.

Bu makalede SignalR'nin ne olduğu ve oluşturmak üzere tasarlandığı bazı çözümler açıklanmaktadır.

Sorular ve yorumlar

Lütfen bu öğreticiyi nasıl beğendiğiniz ve sayfanın altındaki yorumlarda neleri geliştirebileceğimiz hakkında geri bildirim bırakın. Öğreticiyle doğrudan ilgili olmayan sorularınız varsa bunları ASP.NET SignalR forumunu veya StackOverflow.com gönderebilirsiniz.

SignalR nedir?

ASP.NET SignalR, uygulamalara gerçek zamanlı web işlevselliği ekleme sürecini basitleştiren ASP.NET geliştiricilerine yönelik bir kitaplıktır. Gerçek zamanlı web işlevi, sunucunun bir istemcinin yeni veri istemesini beklemesini sağlamak yerine, sunucu kodunun kullanılabilir olduğunda bağlı istemcilere anında içerik göndermesini sağlamaktır.

SignalR, ASP.NET uygulamanıza her türlü "gerçek zamanlı" web işlevini eklemek için kullanılabilir. Sohbet genellikle örnek olarak kullanılır ancak çok daha fazlasını yapabilirsiniz. Kullanıcı yeni verileri görmek için bir web sayfasını yenilediğinde veya sayfa yeni verileri almak için uzun yoklama uyguladığında, SignalR kullanımı için bir adaydır. Örnek olarak panolar ve izleme uygulamaları, işbirliğine dayalı uygulamalar (belgelerin eşzamanlı olarak düzenlenmesi gibi), iş ilerleme durumu güncelleştirmeleri ve gerçek zamanlı formlar verilebilir.

SignalR ayrıca sunucudan yüksek frekanslı güncelleştirmeler gerektiren tamamen yeni web uygulaması türlerini (örneğin, gerçek zamanlı oyun) etkinleştirir.

SignalR, sunucu tarafı .NET kodundan istemci tarayıcılarında (ve diğer istemci platformlarında) JavaScript işlevlerini çağıran sunucudan istemciye uzak yordam çağrıları (RPC) oluşturmak için basit bir API sağlar. SignalR ayrıca bağlantı yönetimi (örneğin, bağlanma ve bağlantıyı kesme olayları) ve bağlantıları gruplandırma api'sini içerir.

SignalR ile çağırma yöntemleri

SignalR, bağlantı yönetimini otomatik olarak işler ve sohbet odası gibi tüm bağlı istemcilere iletileri aynı anda yayınlamanıza olanak tanır. Ayrıca, belirli istemcilere ileti gönderebilirsiniz. İstemci ve sunucu arasındaki bağlantı, her iletişim için yeniden kurulan klasik HTTP bağlantısının aksine kalıcıdır.

SignalR, sunucu kodunun bugün web'de yaygın olarak kullanılan istek-yanıt modeli yerine Uzaktan Yordam Çağrılarını (RPC) kullanarak tarayıcıdaki istemci koduna çağrıda bulunabildiği "sunucu gönderme" işlevini destekler.

SignalR uygulamaları yerleşik ve üçüncü taraf ölçek genişletme sağlayıcıları kullanarak binlerce istemciye ölçek genişletebilir.

Yerleşik sağlayıcılar şunlardır:

Üçüncü taraf sağlayıcılar şunlardır:

SignalR, GitHub üzerinden erişilebilen açık kaynaktır.

SignalR ve WebSocket

SignalR, yeni WebSocket aktarımını kullanılabilir durumda kullanır ve gerektiğinde eski aktarımlara geri döner. Uygulamanızı doğrudan WebSocket kullanarak yazabilirsiniz ancak SignalR kullanmak, uygulamanız gereken ek işlevlerin birçoğunun sizin için zaten yapıldığı anlamına gelir. En önemlisi, eski istemciler için ayrı bir kod yolu oluşturma konusunda endişelenmenize gerek kalmadan uygulamanızı WebSocket'in avantajlarından yararlanacak şekilde kodlayabileceğiniz anlamına gelir. SignalR ayrıca WebSocket güncelleştirmeleri konusunda endişelenmenize gerek kalmaz, çünkü SignalR temel alınan aktarımdaki değişiklikleri destekleyecek şekilde güncelleştirilir ve uygulamanıza WebSocket sürümleri arasında tutarlı bir arabirim sağlar.

Taşımalar ve geri dönüşler

SignalR, istemci ile sunucu arasında gerçek zamanlı iş yapmak için gereken bazı aktarımların soyutlamasıdır. SignalR, mümkünse önce bir WebSocket bağlantısı kurmayı dener. WebSocket, SignalR için en uygun aktarımdır çünkü aşağıdakilere sahiptir:

  • Sunucu belleğinin en verimli kullanımı.
  • En düşük gecikme süresi.
  • İstemci ve sunucu arasındaki tam çift yönlü iletişim gibi en temel özellikler.
  • En katı gereksinimler olan WebSocket için sunucu gerekir:
    • Windows Server 2012 veya Windows 8'de çalıştırın.
    • .NET Framework 4.5.

Bu gereksinimler karşılanmazsa SignalR, bağlantılarını yapmak için diğer aktarımları kullanmayı dener.

HTML 5 aktarımları

Bu aktarımlar HTML 5 desteğine bağlıdır. İstemci tarayıcısı HTML 5 standardını desteklemiyorsa, eski aktarımlar kullanılır.

  • WebSocket (hem sunucu hem de tarayıcı WebSocket'i destekleyebildiğini belirtiyorsa). WebSocket, istemci ve sunucu arasında gerçek kalıcı, iki yönlü bağlantı kuran tek aktarımdır. Ancak, WebSocket de en sıkı gereksinimlere sahiptir; yalnızca Microsoft Internet Explorer, Google Chrome ve Mozilla Firefox'un en son sürümlerinde tam olarak desteklenir ve Opera ve Safari gibi diğer tarayıcılarda yalnızca kısmi bir uygulamaya sahiptir.
  • EventSource olarak da bilinen Sunucu Tarafından Gönderilen Olaylar (tarayıcı, Internet Explorer dışındaki tüm tarayıcılar olan Sunucu Tarafından Gönderilen Olayları destekliyorsa.)

Kuyrukluyıldız taşımaları

Aşağıdaki aktarımlar, bir tarayıcının veya başka bir istemcinin uzun süre tutulan bir HTTP isteği tuttuğu, sunucunun istemci özel olarak istekte bulunmadan verileri istemciye göndermek için kullanabileceği Comet web uygulaması modelini temel alır.

  • Forever Frame (yalnızca Internet Explorer için). Forever Frame, sunucudaki tamamlanmayan bir uç noktaya istekte bulunan gizli bir IFrame oluşturur. Sunucu daha sonra istemciye sürekli olarak betik gönderir ve bu komut dosyası anında yürütülür ve sunucudan istemciye tek yönlü gerçek zamanlı bağlantı sağlar. İstemciden sunucuya bağlantı, sunucudan istemci bağlantısına ayrı bir bağlantı kullanır ve standart bir HTTP isteği gibi, gönderilmesi gereken her veri parçası için yeni bir bağlantı oluşturulur.
  • Ajax uzun yoklama tekniği. Uzun yoklama kalıcı bir bağlantı oluşturmaz, bunun yerine sunucu yanıt verene kadar açık kalan bir istekle sunucuyu yoklar; bu noktada bağlantı kapanır ve hemen yeni bir bağlantı istenir. Bu, bağlantı sıfırlanırken biraz gecikmeye neden olabilir.

Hangi aktarımların hangi yapılandırmalar altında desteklendiği hakkında daha fazla bilgi için bkz. Desteklenen Platformlar.

Taşıma seçimi işlemi

Aşağıdaki listede SignalR'ın hangi aktarımın kullanılacağına karar vermek için kullandığı adımlar gösterilmektedir.

  1. Tarayıcı Internet Explorer 8 veya önceki bir sürümse, Long Polling tekniği kullanılır.

  2. JSONP yapılandırıldıysa (yani, jsonp bağlantı başlatıldığında parametre olarak true ayarlanırsa), uzun yoklama kullanılır.

  3. Etki alanları arası bağlantı yapılıyorsa (yani SignalR uç noktası barındırma sayfasıyla aynı etki alanında değilse), aşağıdaki ölçütler karşılanırsa WebSocket kullanılır:

    • İstemci CORS'yi (Çıkış Noktaları Arası Kaynak Paylaşımı) destekler. Hangi istemcilerin CORS'yi desteklediği hakkında ayrıntılı bilgi için bkz. caniuse.com'de CORS.

    • İstemci WebSocket'i destekler

    • Sunucu WebSocket'i destekler

      Bu ölçütlerden herhangi biri karşılanmazsa, Uzun Yoklama kullanılır. Etki alanları arası bağlantılar hakkında daha fazla bilgi için bkz. Etki alanları arası bağlantı kurma.

  4. JSONP yapılandırılmamışsa ve bağlantı etki alanları arasında değilse, hem istemci hem de sunucu destekliyorsa WebSocket kullanılır.

  5. İstemci veya sunucu WebSocket'i desteklemiyorsa, varsa Sunucu Tarafından Gönderilen Olaylar kullanılır.

  6. Sunucu Tarafından Gönderilen Olaylar kullanılamıyorsa, Forever Frame kullanımı denenecektir.

  7. Forever Frame başarısız olursa, Uzun Yoklama kullanılır.

Aktarımları izleme

Hub'ınızda günlüğe kaydetmeyi etkinleştirerek ve tarayıcınızda konsol penceresini açarak, uygulamanızın hangi taşıma yöntemini kullandığını belirleyebilirsiniz.

Hub'ınızın olaylarının günlüğe kaydedilmesini bir tarayıcıda etkinleştirmek için istemci uygulamanıza aşağıdaki komutu ekleyin:

$.connection.hub.logging = true;

  • Internet Explorer'da, F12'ye basarak geliştirici araçlarını açın ve Konsol sekmesine tıklayın.

    Microsoft Internet Explorer'da konsol

  • Chrome'da Ctrl+Shift+J tuşlarına basarak konsolu açın.

    Google Chrome'da konsol

Konsol açık ve loglama etkinleştirildiğinde, SignalR tarafından hangi aktarımın kullanıldığını görebilirsiniz.

WebSocket aktarımını gösteren Internet Explorer konsolu

Taşıma belirtme

Aktarım anlaşması belirli bir süre ve istemci/sunucu kaynakları gerektirir. İstemci özellikleri biliniyorsa, istemci bağlantısı başlatıldığında bir aktarım belirtilebilir. Aşağıdaki kod parçacığı, istemcinin başka bir protokolü desteklemediği biliniyorsa kullanılacağı gibi Ajax Long Polling aktarımını kullanarak bağlantı başlatmayı gösterir:

connection.start({ transport: 'longPolling' });

İstemcinin belirli taşımaları sırayla denemesini istiyorsanız bir geri dönüş sırası belirtebilirsiniz. Aşağıdaki kod parçacığı, WebSocket denemesini ve eğer başarısız olursa doğrudan Long Polling'e geçişi gösterir.

connection.start({ transport: ['webSockets','longPolling'] });

Aktarımları belirtmek için dize sabitleri aşağıdaki gibi tanımlanır:

  • webSockets
  • foreverFrame
  • serverSentEvents
  • longPolling

Bağlantılar ve Merkezler

SignalR API'sinde istemciler ve sunucular arasında iletişim kurmak için iki model bulunur: Kalıcı Bağlantılar ve Hub'lar.

Bağlantı, tek alıcılı, gruplandırılmış veya yayın iletileri göndermek için basit bir uç noktayı temsil eder. Kalıcı Bağlantı API'si (PersistentConnection sınıfı tarafından .NET kodunda temsil edilir) geliştiriciye SignalR'ın kullanıma sunduğu alt düzey iletişim protokolüne doğrudan erişim verir. Bağlantılar iletişim modelinin kullanılması, Windows Communication Foundation gibi bağlantı tabanlı API'leri kullanan geliştiricilere tanıdık gelir.

Hub, bağlantı API'sinin üzerine kurulmuş ve istemcinizin ve sunucunuzun doğrudan birbirleri üzerinde yöntemler çağırmasına olanak tanıyan daha üst düzey bir işlem hattıdır. SignalR, makine sınırları arasında gönderimi sihir gibi işler ve istemcilerin sunucudaki yöntemleri yerel yöntemler kadar kolay çağırmasına olanak tanır ve tam tersi de geçerlidir. Hubs iletişim modelinin kullanılması, .NET Uzaktan İletişimi gibi uzaktan çağırma API'lerini kullanan geliştiricilere tanıdık gelir. Hub'ı kullanmak, model bağlamayı etkinleştirerek kesin olarak belirlenmiş parametreleri yöntemlere geçirmenize de olanak tanır.

Mimari diyagramı

Aşağıdaki diyagramda Hub'lar, Kalıcı Bağlantılar ve taşımalar için kullanılan temel teknolojiler arasındaki ilişki gösterilmektedir.

API'leri, aktarımları ve istemcileri gösteren SignalR Mimari Diyagramı

Hub'lar nasıl çalışır?

Sunucu tarafı kodu istemcideki bir yöntemi çağırdığında, çağrılacak yöntemin adını ve parametrelerini içeren etkin aktarımda bir paket gönderilir (bir nesne yöntem parametresi olarak gönderildiğinde, JSON kullanılarak serileştirilir). İstemci daha sonra yöntem adını istemci tarafı kodunda tanımlanan yöntemlerle eşleştirir. Eşleşme varsa istemci yöntemi seri durumdan çıkarılmış parametre verileri kullanılarak yürütülür.

Yöntem çağrısı Fiddler gibi araçlar kullanılarak izlenebilir. Aşağıdaki görüntüde, Fiddler'ın Günlükler bölmesinde SignalR sunucusundan web tarayıcısı istemcisine gönderilen yöntem çağrısı gösterilmektedir. Yöntem çağrısı, MoveShapeHub adlı bir hub'tan gönderiliyor ve çağrılan yöntem updateShape olarak adlandırılıyor.

SignalR trafiğini gösteren Fiddler günlüğünün görünümü

Bu örnekte, hub adı parametresiyle H tanımlanır; yöntem adı parametresiyle M tanımlanır ve yönteme gönderilen veriler parametresiyle A tanımlanır. Bu iletiyi oluşturan uygulama High-Frequency Realtime öğreticisinde oluşturulur.

İletişim modeli seçme

Uygulamaların çoğu Hubs API'sini kullanmalıdır. Bağlantılar API'sini aşağıdaki durumlarda kullanabilirsiniz:

  • Gönderilen gerçek iletinin biçimi belirtilmelidir.
  • Geliştirici, uzaktan çağırma modeli yerine mesajlaşma ve gönderme modeliyle çalışmayı tercih eder.
  • Mevcut bir mesajlaşma modeli kullanan uygulama, SignalR kullanacak şekilde taşınıyor.