Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, işleyebileceğiniz SignalR bağlantısı, yeniden bağlantı ve bağlantı kesme olaylarına ve yapılandırabileceğiniz zaman aşımı ve koruma ayarlarına genel bir bakış sağlanır.
Makalede SignalR ve bağlantı ömrü olayları hakkında zaten bilginiz olduğu varsayılmaktadır. SignalR'ye giriş için bkz . SignalR'ye giriş. Bağlantı ömrü olaylarının listeleri için aşağıdaki kaynaklara bakın:
- Hub sınıfında bağlantı ömrü olaylarını işleme
- JavaScript istemcilerinde bağlantı ömrü olaylarını işleme
- .NET istemcilerinde bağlantı ömrü olaylarını işleme
Bu konuda kullanılan yazılım sürümleri
- Visual Studio 2017
- .NET 4.5
- SignalR sürüm 2
Bu konunun önceki sürümleri
SignalR'nin önceki sürümleri hakkında bilgi için bkz . SignalR Eski Sürümleri.
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.
Genel bakış
Bu makale aşağıdaki bölümleri içerir:
API Referans konularına yapılan bağlantılar, API'nin .NET 4.5 sürümüne yöneliktir. .NET 4 kullanıyorsanız API konularının .NET 4 sürümüne bakın.
Bağlantı ömrü terminolojisi ve senaryoları
OnReconnected SignalR Hub'ındaki olay işleyicisi, bir istemci için OnConnected'den hemen sonra yürütülebilir, ancak OnDisconnected'den sonra yürütülemez. Bağlantı kesilmeden yeniden bağlantı kurabilmenizin nedeni, SignalR'de "bağlantı" sözcüğünün kullanıldığı çeşitli yollar olmasıdır.
SignalR bağlantıları, aktarım bağlantıları ve fiziksel bağlantılar
Bu makale SignalR bağlantıları, aktarım bağlantıları ve fiziksel bağlantılar arasında ayrım yapacaktır:
-
SignalR bağlantısı , bir istemci ile sunucu URL'si arasındaki, SignalR API'si tarafından korunan ve bir bağlantı kimliğiyle benzersiz olarak tanımlanan mantıksal ilişkiyi ifade eder. Bu ilişkiyle ilgili veriler SignalR tarafından korunur ve aktarım bağlantısı kurmak için kullanılır. İstemci
Stopyöntemini çağırdığında veya SignalR kaybolan bir aktarım bağlantısını yeniden kurmaya çalışırken zaman aşımı sınırına ulaşıldığında, ilişki sona erer ve SignalR verileri temizler. - Aktarım bağlantısı , istemci ile sunucu arasındaki mantıksal ilişkiyi ifade eder ve bu ilişki, dört aktarım API'lerinden biri tarafından korunur: WebSockets, sunucu tarafından gönderilen olaylar, sonsuza kadar çerçeve veya uzun yoklama. SignalR, aktarım bağlantısı oluşturmak için aktarım API'sini kullanır ve aktarım API'si aktarım bağlantısını oluşturmak için fiziksel ağ bağlantısının varlığına bağlıdır. Aktarım bağlantısı SignalR tarafından sonlandırıldığında veya aktarım API'sinin fiziksel bağlantının kesildiğini algıladığında sona erer.
- Fiziksel bağlantı , bir istemci bilgisayarla sunucu bilgisayarı arasındaki iletişimi kolaylaştıran fiziksel ağ bağlantılarını (kablolar, kablosuz sinyaller, yönlendiriciler vb.) ifade eder. Aktarım bağlantısı kurmak için fiziksel bağlantı mevcut olmalı ve SignalR bağlantısı kurmak için bir aktarım bağlantısı kurulmalıdır. Bununla birlikte, fiziksel bağlantının bozulması her zaman aktarım bağlantısını veya SignalR bağlantısını hemen sonlandırmaz. Bu konunun ilerleyen bölümlerinde anlatılacağı gibi.
Aşağıdaki diyagramda SignalR bağlantısı Hubs API ve PersistentConnection API SignalR katmanı, aktarım bağlantısı Aktarımlar katmanı ve fiziksel bağlantı ise sunucu ile istemciler arasındaki çizgilerle temsil edilir.
SignalR istemcisinde yöntemini çağırdığınızda Start , bir sunucuya fiziksel bağlantı kurmak için SignalR istemci koduna gereken tüm bilgileri sağlarsınız. SignalR istemci kodu, http isteğinde bulunmak ve dört aktarım yönteminden birini kullanan fiziksel bir bağlantı kurmak için bu bilgileri kullanır. Aktarım bağlantısı başarısız olursa veya sunucu başarısız olursa, istemci aynı SignalR URL'sine otomatik olarak yeni bir aktarım bağlantısı kurmak için gereken bilgilere sahip olduğundan SignalR bağlantısı hemen kaybolmaz. Bu senaryoda, kullanıcı uygulamasından hiçbir müdahale söz konusu değildir ve SignalR istemci kodu yeni bir aktarım bağlantısı oluşturduğunda yeni bir SignalR bağlantısı başlatmaz. SignalR bağlantısının sürekliliği, Start yöntemini çağırdığınızda oluşturulan bağlantı kimliğinin değişmemesiyle yansıtılır.
Hub'daki OnReconnected olay işleyicisi, bir aktarım bağlantısı kaybolduktan sonra otomatik olarak yeniden kurulduğunda yürütülür. Olay OnDisconnected işleyicisi SignalR bağlantısının sonunda yürütülür. SignalR bağlantısı aşağıdaki yollardan biriyle sona erebilir:
- İstemci yöntemini çağırırsa
Stop, sunucuya bir durdurma iletisi gönderilir ve hem istemci hem de sunucu SignalR bağlantısını hemen sonlar. - İstemci ile sunucu arasındaki bağlantı kesildikten sonra istemci yeniden bağlanmayı dener ve sunucu istemcinin yeniden bağlanmasını bekler. Yeniden bağlanma girişimleri başarısız olursa ve bağlantı kesme zaman aşımı süresi sona ererse hem istemci hem de sunucu SignalR bağlantısını sonlandırır. İstemci yeniden bağlanmayı denemeyi durdurur ve sunucu SignalR bağlantısının gösterimini ortadan kaldırıyor.
- İstemci yöntemini çağırma
Stopşansı olmadan çalışmayı durdurursa, sunucu istemcinin yeniden bağlanmasını bekler ve bağlantı kesme zaman aşımı süresinden sonra SignalR bağlantısını sonlandırır. - Sunucu çalışmayı durdurursa, istemci yeniden bağlanmaya çalışır (aktarım bağlantısını yeniden oluşturur) ve bağlantı kesme zaman aşımı süresinden sonra SignalR bağlantısını sonlandırır.
Bağlantı sorunu olmadığında ve kullanıcı uygulaması signalr bağlantısını yöntemini çağırarak Stop sonlandırdığında SignalR bağlantısı ve aktarım bağlantısı yaklaşık aynı anda başlar ve biter. Aşağıdaki bölümlerde diğer senaryolar daha ayrıntılı olarak açıklanmaktadır.
Aktarım bağlantısı kesme senaryoları
Fiziksel bağlantılar yavaş olabilir veya bağlantıda kesintiler olabilir. Kesintinin uzunluğu gibi faktörlere bağlı olarak aktarım bağlantısı kesilebilir. SignalR daha sonra aktarım bağlantısını yeniden kurmaya çalışır. Bazen aktarım bağlantısı API'si kesintiyi algılar ve aktarım bağlantısını bırakır ve SignalR bağlantının kaybolduğunu hemen öğrenir. Diğer senaryolarda, ne aktarım bağlantısı API'sinin ne de SignalR'nin bağlantının kaybolduğunu hemen fark etmez. Uzun yoklama dışındaki tüm aktarımlarda SignalR istemcisi, aktarım API'sinin algılayamadığı bağlantı kaybını denetlemek için keepalive adlı bir işlev kullanır. Uzun yoklama bağlantıları hakkında bilgi için bu konunun ilerleyen bölümlerinde Zaman aşımı ve keepalive ayarları bölümüne bakın.
Bir bağlantı etkin olmadığında, sunucu düzenli aralıklarla istemciye bir "keepalive" paketi gönderir. Bu makalenin yazıldığı tarihten itibaren varsayılan sıklık 10 saniyede birdir. İstemciler bu paketleri dinleyerek bir bağlantı sorunu olup olmadığını anlayabilir. Beklenen zamanda bir keepalive paketi alınmazsa, kısa süre sonra istemci yavaşlık veya kesintiler gibi bağlantı sorunları olduğunu düşünür. Eğer canlı tutma paketi uzun bir süre geçmesine rağmen hala alınmazsa, istemci bağlantının kesildiğini varsayar ve tekrar bağlanmaya çalışmaya başlar.
Aşağıdaki diyagramda, aktarım API'si tarafından hemen tanınmayan fiziksel bağlantıyla ilgili sorunlar olduğunda tipik bir senaryoda ortaya konan istemci ve sunucu olayları gösterilmektedir. Diyagram aşağıdaki durumlar için geçerlidir:
- Aktarım WebSockets, forever frame veya sunucu tarafından gönderilen etkinliklerdir.
- Fiziksel ağ bağlantısında çeşitli kesinti dönemleri vardır.
- Aktarım API'si kesintilerin farkında değildir, bu nedenle SignalR bunları algılamak için koruma işlevselliğine dayanır.
İstemci yeniden bağlanma moduna geçerse ancak bağlantı kesme zaman aşımı sınırı içinde bir aktarım bağlantısı kuramazsa, sunucu SignalR bağlantısını sonlandırır. Bu gerçekleştiğinde, sunucu Hub'ın OnDisconnected yöntemini çalıştırır ve istemcinin daha sonra bağlanabilmesi durumunda istemciye göndermek için bir bağlantı kesme mesajını kuyruğa alır. İstemci yeniden bağlanırsa disconnect komutunu alır ve yöntemini çağırır Stop . Bu senaryoda, OnReconnected istemci yeniden bağlandığında yürütülmedi ve OnDisconnected istemci çağırdığında Stopyürütülmedi. Aşağıdaki diyagramda bu senaryo gösterilmektedir.
İstemcide oluşturulabilecek SignalR bağlantı ömrü olayları şunlardır:
ConnectionSlowistemci olayı.Son ileti veya keepalive ping alındığından bu yana keepalive zaman aşımı süresinin önceden belirlenmiş bir oranı geçtiğinde oluşur. Varsayılan keepalive zaman aşımı uyarı süresi, keepalive zaman aşımının 2/3'üdür. Tutma zaman aşımı 20 saniyedir, bu nedenle uyarı yaklaşık 13 saniyede gerçekleşir.
Varsayılan olarak, sunucu, her 10 saniyede bir keepalive ping gönderir ve istemci, her 2 saniyede bir (keepalive zaman aşımı değeri ile keepalive zaman aşımı uyarı değeri arasındaki farkın üçte birinde) keepalive pingleri denetler.
Taşıma API'si bir bağlantı kesintisinin farkına varırsa, bu, devamlılık zaman aşımı uyarı süresi dolmadan önce SignalR'a bildirilebilir. Bu durumda
ConnectionSlowolayı tetiklenmez ve SignalR doğrudanReconnectingolayına geçer.Reconnectingistemci olayı.(a) aktarım API'si bağlantının kaybolduğunu algıladığında veya (b) son mesaj veya keepalive ping alındığından bu yana belirlenen keepalive süre aşımı gerçekleştiğinde tetiklenir. SignalR istemci kodu yeniden bağlanmaya çalışmaya başlar. Uygulamanızın bir aktarım bağlantısı kaybolduğunda bazı eylemler gerçekleştirmesini istiyorsanız bu olayı işleyebilirsiniz. Varsayılan tutma zaman aşımı süresi şu anda 20 saniyedir.
İstemci kodunuz SignalR yeniden bağlanma modundayken hub yöntemini çağırmaya çalışırsa SignalR komutu göndermeye çalışır. Çoğu zaman bu tür girişimler başarısız olur, ancak bazı durumlarda başarılı olabilirler. Sunucu tarafından gönderilen olaylar, sonsuza kadar çerçeve ve uzun yoklama aktarımları için SignalR, istemcinin ileti göndermek için kullandığı ve iletileri almak için kullandığı iki iletişim kanalını kullanır. Almak için kullanılan kanal kalıcı olarak açık olan kanaldır ve fiziksel bağlantı kesildiğinde kapatılan kanaldır. Göndermek için kullanılan kanal kullanılabilir durumda kalır, bu nedenle fiziksel bağlantı geri yüklenirse, alma kanalı yeniden kurulmadan önce istemciden sunucuya bir yöntem çağrısı başarılı olabilir. SignalR almak için kullanılan kanalı yeniden açana kadar dönüş değeri alınmaz.
Reconnectedistemci olayı.Aktarım bağlantısı yeniden başlatıldığında tetiklenir.
OnReconnectedHub'daki olay işleyicisi çalıştırılır.Closedclient event (disconnectedJavaScript'te olay).SignalR istemci kodu aktarım bağlantısını kaybettikten sonra yeniden bağlanmaya çalışırken bağlantı kesme zaman aşımı süresi dolduğunda tetikleniyor. Varsayılan bağlantı kesme zaman aşımı 30 saniyedir. Bu olay, bağlantı sona erdiğinde ve
Stopyöntemi çağrıldığında da oluşur.
Aktarım API'si tarafından algılanmayan ve sunucudan gelen tutma pinglerinin alımını tutma zaman aşımı uyarı süresinden daha uzun süre geciktirmeyen aktarım bağlantısı kesintileri, bağlantı ömrü olaylarının tetiklenmesine neden olmayabilir.
Bazı ağ ortamları boştaki bağlantıları kasten kapatır ve keepalive paketlerinin bir diğer işlevi, bu ağlara bir SignalR bağlantısının kullanımda olduğunu haber vererek bunu önlemeye yardımcı olmaktır. Aşırı durumlarda, kapalı bağlantıları önlemek için varsayılan kalıcı ping sıklığı yeterli olmayabilir. Bu durumda, keepalive ping'lerinin daha sık gönderilmesi için yapılandırma yapabilirsiniz. Daha fazla bilgi için bu konunun devamında yer alan Zaman aşımı ve koruma ayarları bölümüne bakın.
Not
Önemli: Burada açıklanan olayların sırası garanti değildir. SignalR, bağlantı ömrü olaylarını bu şemaya göre tahmin edilebilir bir şekilde yükseltmeye çalışır, ancak ağ olaylarının birçok varyasyonu ve taşıma API'leri gibi temel iletişim çerçevelerinin bunları işlemesinin birçok yolu vardır. Örneğin, Reconnected istemci yeniden bağlandığında olay tetiklenmeyebilir veya OnConnected bağlantı kurma girişimi başarısız olduğunda sunucudaki işleyici çalıştırılabilir. Bu konu yalnızca belirli tipik koşullar tarafından normalde üretilecek etkileri açıklar.
İstemci bağlantısı kesme senaryoları
Tarayıcı istemcisinde, SignalR bağlantısını koruyan SignalR istemci kodu bir web sayfasının JavaScript bağlamında çalışır. Bir sayfadan diğerine geçtiğinizde SignalR bağlantısının sona ermesi gerekir. Ayrıca, birden çok tarayıcı penceresi veya sekmesi üzerinden bağlanırsanız, her birine ait farklı bağlantı kimlikleriyle birden fazla bağlantınız olur. Kullanıcı bir tarayıcı penceresini veya sekmesini kapattığında veya yeni bir sayfaya gittiğinde veya sayfayı yenilediğinde SignalR bağlantısı hemen sona erer çünkü SignalR istemci kodu bu tarayıcı olayını sizin için işler ve yöntemini çağırır Stop . Bu senaryolarda veya herhangi bir istemci platformunda, uygulamanız Stop yöntemini çağırdığında, OnDisconnected olay işleyicisi sunucuda hemen yürütülür ve istemci Closed olayını tetikler (JavaScript'te olay disconnected olarak adlandırılır).
Bir istemci uygulaması veya üzerinde çalıştırdığı bilgisayar kilitlenirse veya uyku moduna geçerse (örneğin, kullanıcı dizüstü bilgisayarı kapattığında), sunucu ne olduğu hakkında bilgilenmez. Sunucunun bilgi dahilinde olduğu kadarıyla, istemcinin kaybı bağlantı kesintisinden kaynaklanabilir ve istemci yeniden bağlanmaya çalışıyor olabilir. Bu nedenle, bu senaryolarda sunucu istemciye yeniden bağlanma şansı vermek için bekler ve OnDisconnected bağlantı kesme zaman aşımı süresi dolana kadar (varsayılan olarak yaklaşık 30 saniye) yürütülemez. Aşağıdaki diyagramda bu senaryo gösterilmektedir.
Sunucu bağlantısı kesme senaryoları
Bir sunucu çevrimdışı olduğunda (yeniden başlatılır, arızalanır, uygulama etki alanı geri dönüşüme geçer vb.), sonuç, bağlantının kaybedilmesine benzer olabilir. Ancak, aktarım API'si ve SignalR sunucunun yok olduğunu hemen anlayabilir ve SignalR olayı ConnectionSlow tetiklemeden yeniden bağlanmaya başlayabilir. İstemci yeniden bağlanma moduna geçerse ve sunucu kurtarılır veya yeniden başlatılırsa ya da bağlantı kesme zaman aşımı süresi dolmadan yeni bir sunucu çevrimiçi olursa, istemci geri yüklenen veya yeni sunucuya yeniden bağlanır. Bu durumda SignalR bağlantısı istemcide devam eder ve Reconnected olayı tetiklenir. İlk sunucuda OnDisconnected hiçbir zaman yürütülemez ve yeni sunucuda yürütülür, OnReconnected ancak OnConnected bu istemci için daha önce hiç yürütülmedi. (Sunucu yeniden başlatıldığında önceki bağlantı etkinliği belleği olmadığından, istemci yeniden başlatma veya uygulama etki alanı geri dönüşümünden sonra aynı sunucuya yeniden bağlanırsa bu etki aynıdır.) Aşağıdaki diyagramda aktarım API'sinin kayıp bağlantının hemen farkında olduğu varsayılır, bu nedenle ConnectionSlow olay tetiklenmez.
Zaman aşımı ve bağlantıyı açık tutma ayarları
Varsayılan ConnectionTimeout, DisconnectTimeoutve KeepAlive değerleri çoğu senaryo için uygundur, ancak ortamınızın özel gereksinimleri varsa değiştirilebilir. Örneğin, ağ ortamınız 5 saniye boyunca boşta olan bağlantıları kapatıyorsa, keepalive süresini azaltmanız gerekebilir.
Bağlantı Zaman Aşımı
Bu ayar, bir yanıt beklerken aktarım bağlantısını kapatıp yeni bir bağlantı açmadan önce ne kadar süre açık bırakılacağını temsil eder. Varsayılan değer 110 saniyedir.
Bu ayar, keepalive işlevselliği devre dışı bırakıldığında geçerlidir ve genellikle yalnızca long polling (uzun yoklama) aktarımları için geçerlidir. Aşağıdaki diyagramda bu ayarın uzun yoklama aktarım bağlantısı üzerindeki etkisi gösterilmektedir.
DisconnectTimeout
Bu ayar, Disconnected olayı oluşturulmadan önce, aktarım bağlantısı kesildikten sonra beklenmesi gereken süreyi temsil eder. Varsayılan değer 30 saniyedir. Ayarladığınızda DisconnectTimeout, KeepAlive değeri otomatik olarak DisconnectTimeout değerinin 1/3'ü olarak ayarlanır.
KeepAlive
Bu ayar, boşta bağlantı üzerinden bir keepalive paketi göndermeden önceki bekleme süresini temsil eder. Varsayılan değer 10 saniyedir. Bu değer, DisconnectTimeout değerinin 1/3'ünden fazla olmamalıdır.
Her ikisini de DisconnectTimeout ve KeepAlive ayarlamak istiyorsanız, önce DisconnectTimeout, sonra KeepAlive ayarlayın. Aksi takdirde, zaman aşımı değerinin 1/3'üne otomatik olarak ayarlandığında KeepAlive ayarınız DisconnectTimeout üzerine yazılacaktırKeepAlive.
Canlı tutma işlevini devre dışı bırakmak istiyorsanız, KeepAlive değerini null olarak ayarlayın. Uzun yoklama aktarımı için bağlantı koruma işlevi otomatik olarak devre dışı bırakılır.
Zaman aşımı ve koruma ayarlarını değiştirme
Bu ayarların varsayılan değerlerini değiştirmek için, aşağıdaki örnekte gösterildiği gibi bunları Application_StartGlobal.asax dosyanıza ayarlayın. Örnek kodda gösterilen değerler varsayılan değerlerle aynıdır.
protected void Application_Start(object sender, EventArgs e)
{
// Make long polling connections wait a maximum of 110 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
// Wait a maximum of 30 seconds after a transport connection is lost
// before raising the Disconnected event to terminate the SignalR connection.
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// For transports other than long polling, send a keepalive packet every
// 10 seconds.
// This value must be no more than 1/3 of the DisconnectTimeout value.
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
RouteTable.Routes.MapHubs();
}
Bağlantıyı kesmeleri kullanıcıya bildirme
Bazı uygulamalarda, bağlantı sorunları olduğunda kullanıcıya bir ileti görüntülemek isteyebilirsiniz. Bunu nasıl ve ne zaman yapabileceğinize ilişkin çeşitli seçenekleriniz vardır. Aşağıdaki kod örnekleri, oluşturulan ara sunucuyu kullanan bir JavaScript istemcisi içindir.
connectionSlowSignalR bağlantı sorunlarını fark eder etmez, yeniden bağlanma moduna geçmeden önce iletiyi görüntülemek için olayı işleyebilirsiniz.$.connection.hub.connectionSlow(function() { notifyUserOfConnectionProblem(); // Your function to notify user. });SignalR bağlantının kesildiğini fark edip yeniden bağlanma moduna geçtiğinde bir iletiyi görüntülemek için
reconnectingolayını ele alın.$.connection.hub.reconnecting(function() { notifyUserOfTryingToReconnect(); // Your function to notify user. });Proposed Improvements: 1. "
disconnectedolayını işleyerek, yeniden bağlanma girişimi zaman aşımına uğradığında bir ileti görüntüleyebilirsiniz. Bu senaryoda, sunucuyla yeniden bağlantı kurmanın tek yolu, yeni bir bağlantı kimliği oluşturacak olanStartyöntemini çağırarak SignalR bağlantısını yeniden başlatmaktır." Aşağıdaki kod örneği, bildirimi yalnızca yeniden bağlanma zaman aşımından sonra yayımladığınızdan emin olmak için bir bayrak kullanır; yöntemin çağrılmasından kaynaklanan SignalR bağlantısına normal bir son verilmesindenStopsonra değil.var tryingToReconnect = false; $.connection.hub.reconnecting(function() { tryingToReconnect = true; }); $.connection.hub.reconnected(function() { tryingToReconnect = false; }); $.connection.hub.disconnected(function() { if(tryingToReconnect) { notifyUserOfDisconnect(); // Your function to notify user. } });
Sürekli yeniden bağlanma
Bazı uygulamalarda bağlantı kesildikten ve yeniden bağlanma girişimi zaman aşımına uğradıktan sonra bağlantıyı otomatik olarak yeniden kurmak isteyebilirsiniz. Bunu yapmak için, olay işleyicinizden Start (ClosedJavaScript istemcilerinde olay işleyicisi) yöntemini çağırabilirsinizdisconnected. Sunucu veya fiziksel bağlantı kullanılamadığında bunu çok sık yapmaktan kaçınmak için Start çağrısı yapmadan önce belirli bir süre beklemek isteyebilirsiniz. Aşağıdaki kod örneği, oluşturulan ara sunucuyu kullanan bir JavaScript istemcisi içindir.
$.connection.hub.disconnected(function() {
setTimeout(function() {
$.connection.hub.start();
}, 5000); // Restart connection after 5 seconds.
});
Mobil istemcilerde dikkat edilmesi gereken olası bir sorun, sunucu veya fiziksel bağlantı kullanılabilir olmadığında sürekli yeniden bağlanma girişimlerinin gereksiz pil boşaltmasına neden olabileceğidir.
Sunucu kodunda istemcinin bağlantısını kesme
SignalR sürüm 2'de istemcilerin bağlantısını kesmek için yerleşik bir sunucu API'si yoktur. Gelecekte bu işlevi eklemeye yönelik planlar vardır. Geçerli SignalR sürümünde, istemcinin sunucu bağlantısını kesmenin en basit yolu istemcide bir bağlantı kesme yöntemi uygulamak ve bu yöntemi sunucudan çağırmaktır. Aşağıdaki kod örneği, oluşturulan ara sunucuyu kullanan bir JavaScript istemcisi için bağlantı kesme yöntemini gösterir.
var myHubProxy = $.connection.myHub
myHubProxy.client.stopClient = function() {
$.connection.hub.stop();
};
Uyarı
Güvenlik - İstemcilerin bağlantısını kesmek için bu yöntem veya önerilen yerleşik API kötü amaçlı kod çalıştıran ele geçirilmiş istemcilerin senaryosunu ele almaz, çünkü istemciler yeniden bağlanabilir veya ele geçirilen kod yöntemi kaldırabilir stopClient veya ne yaptığını değiştirebilir. Durum bilgili hizmet reddi (DOS) korumasını uygulamak için uygun yer, çerçevede veya sunucu katmanında değil, ön uç altyapısındadır.
Bağlantı kesilmesinin nedenini algılama
SignalR 2.1, sunucu OnDisconnect olayına istemcinin zaman aşımı yerine kasıtlı olarak bağlantısının kesilip kesilmediğini gösteren bir aşırı yükleme ekler. StopCalled İstemci bağlantıyı açıkça kapattıysa parametresi true olur. JavaScript'te bir sunucu hatası istemcinin bağlantısını kesmeye neden olursa, hata bilgileri istemciye olarak $.connection.hub.lastErrorgeçirilir.
C# sunucu kodu: stopCalled parametre
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
if (stopCalled)
{
Console.WriteLine(String.Format("Client {0} explicitly closed the connection.", Context.ConnectionId));
}
else
{
Console.WriteLine(String.Format("Client {0} timed out .", Context.ConnectionId));
}
return base.OnDisconnected(stopCalled);
}
JavaScript istemci kodu: disconnect olayındaki lastError'e erişim.
$.connection.hub.disconnected(function () {
if ($.connection.hub.lastError)
{ alert("Disconnected. Reason: " + $.connection.hub.lastError.message); }
});