Aracılığıyla paylaş


SignalR’da Bağlantı Ömrü Olaylarını Anlama ve İşleme

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, 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:

Bu konuda kullanılan yazılım sürümleri

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 Başvurusu konularına bağlantılar, API'nin .NET 4.5 sürümünedir. .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'ında olay işleyicisi, belirli bir istemci için doğrudan sonra OnConnected yürütülebilir ancak sonra OnDisconnected 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 yöntemi çağırdığında Stop veya SignalR kayıp 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 atılır.
  • 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 mimari diyagramı

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, yöntemini çağırdığınızda oluşturulan bağlantı kimliğinin değişmemesi gerçeğine Start 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 devamında yer alan Zaman aşımı ve koruma ayarları bölümüne bakın.

Bir bağlantı etkin olmadığında, sunucu düzenli aralıklarla istemciye bir tutma 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. Beklendiği zaman bir tutma paketi alınmazsa, kısa bir süre sonra istemci yavaşlık veya kesintiler gibi bağlantı sorunları olduğunu varsayar. Tutma işlemi daha uzun bir süre sonra hala alınmazsa, istemci bağlantının bırakıldığını varsayar ve yeniden bağlanmaya 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 olaylardır.
  • 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.

Aktarım bağlantı kesilmeleri

İ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 durumda, sunucu Hub'ın OnDisconnected yöntemini yürütür ve istemcinin daha sonra bağlanmayı yönetmesi durumunda istemciye göndermek üzere bir bağlantı kesme iletisi 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.

Aktarım kesintileri - sunucu zaman aşımı

İstemcide oluşturulabilecek SignalR bağlantı ömrü olayları şunlardır:

  • ConnectionSlow istemci olayı.

    Son ileti veya kalıcı ping alındığından bu yana tutma zaman aşımı süresinin önceden ayarlanmış bir oranı geçtiğinde tetiklendi. Varsayılan tutma zaman aşımı uyarı süresi, tutma 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 tutmalı 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 biri) için sürekli pingleri denetler.

    Aktarım API'sinin bağlantı kesildiğinden haberdar olması durumunda, tutma zaman aşımı uyarı süresi geçmeden önce SignalR'a bağlantı kesilmesi bildirilebilir. Bu durumda olay ConnectionSlow tetiklenmez ve SignalR doğrudan Reconnecting olaya gider.

  • Reconnecting istemci olayı.

    (a) aktarım API'sinin bağlantının kaybolduğunu algıladığında veya (b) son ileti veya kalıcı ping alındığından bu yana kalıcı zaman aşımı süresi geçtiğinde tetiklendi. 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.

  • Reconnected istemci olayı.

    Aktarım bağlantısı yeniden başlatıldığında tetiklenir. OnReconnected Hub'daki olay işleyicisi yürütülür.

  • Closed client event (disconnected JavaScript'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, yöntem çağrıldığından bağlantı sona erdiğinde Stop de oluşur.)

Aktarım API'sinin algılamadığı ve sunucudan gelen tutmalı pinglerin 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 tutma paketlerinin bir diğer işlevi de bu ağlara 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, daha sık gönderilecek tutmalı ping'leri yapılandırabilirsiniz. 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. Bu nedenle, bir sayfadan diğerine geçtiğinizde SignalR bağlantısının bitmesi gerekir ve bu nedenle birden çok tarayıcı penceresinden veya sekmesinden bağlanıyorsanız birden çok bağlantı kimlikli birden çok 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 uygulamanız yöntemini çağırdığında Stop herhangi bir istemci platformunda olay OnDisconnected işleyicisi sunucuda hemen yürütülür ve istemci olayı başlatır Closed (olay JavaScript'te adlandırılır disconnected ).

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 bildiği kadarıyla, istemcinin kaybı bağlantı kesintisi 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.

İstemci bilgisayar hatası

Sunucu bağlantısı kesme senaryoları

Bir sunucu çevrimdışı olduğunda ( yeniden başlatılır, başarısız olur, uygulama etki alanı geri dönüşüme geçer vb.) sonuç, bağlantının kaybolmasına benzer olabilir veya aktarım API'si ve SignalR sunucunun kaybolduğunu hemen anlayabilir ve SignalR olayı oluşturmadan ConnectionSlow 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 oluşturulur. İ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.

Sunucu hatası ve yeniden bağlantı Bağlantı kesme zaman aşımı süresi içinde bir sunucu kullanılamazsa SignalR bağlantısı sona erer. Bu senaryoda, istemcide 'Kapatıldı' olayı (JavaScript istemcilerinde 'bağlantısı kesildi') oluşturulur ancak sunucuda hiçbir zaman 'OnDisconnected' çağrılmaz. Aşağıdaki diyagramda aktarım API'sinin kayıp bağlantıdan haberdar olmadığı varsayılır, bu nedenle SignalR tutma işlevselliği tarafından algılanır ve 'ConnectionSlow' olayı tetiklenir.

Sunucu hatası ve zaman aşımı

Zaman aşımı ve koruma 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ırsa, tutma değerini azaltmanız gerekebilir.

ConnectionTimeout

Bu ayar, aktarım bağlantısını kapatıp yeni bir bağlantı açmadan önce yanıt bekleyen ve açık bırakma süresini temsil eder. Varsayılan değer 110 saniyedir.

Bu ayar yalnızca tutma işlevselliği devre dışı bırakıldığında geçerlidir ve normalde yalnızca 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.

Uzun yoklama aktarım bağlantısı

DisconnectTimeout

Bu ayar, olayı oluşturmadan önce aktarım bağlantısı kesildikten sonra beklenmesi Disconnected gereken süreyi temsil eder. Varsayılan değer 30 saniyedir. ayarladığınızdaDisconnectTimeoutKeepAlive, değerin 1/3'lük DisconnectTimeout kısmı otomatik olarak ayarlanır.

KeepAlive

Bu ayar, boşta bağlantı üzerinden bir tutma paketi göndermeden önce bek süresini temsil eder. Varsayılan değer 10 saniyedir. Bu değer değerin 1/3'ünden DisconnectTimeout büyük olmamalıdır.

ve her ikisini de DisconnectTimeout ayarlamak istiyorsanız, sonra DisconnectTimeoutayarlayınKeepAlive.KeepAlive Aksi takdirde, zaman aşımı değerinin 3'de 1'ine otomatik olarak ayarlandığında ayarınızın KeepAlive üzerine yazılırDisconnectTimeout.KeepAlive

Canlı tutma işlevini devre dışı bırakmak istiyorsanız null olarak ayarlayın KeepAlive . Uzun yoklama taşıması için tutma 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, bunları aşağıdaki örnekte gösterildiği gibi Global.asax dosyanızda ayarlayınApplication_Start. Ö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.

  • connectionSlow SignalR 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.
    });
    
  • reconnecting SignalR bağlantının kesildiğinden haberdar olduğunda ve yeniden bağlanma moduna geçtiğinde iletiyi görüntülemek için olayı işleyebilirsiniz.

    $.connection.hub.reconnecting(function() {
        notifyUserOfTryingToReconnect(); // Your function to notify user.
    });
    
  • disconnected Yeniden bağlanma girişimi zaman aşımına uğradıklarında iletiyi görüntülemek için olayı işleyebilirsiniz. Bu senaryoda, sunucuyla yeniden bağlantı kurmanın tek yolu, yeni bir bağlantı kimliği oluşturacak yöntemi çağırarak Start 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 verilmesinden Stop sonra 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 Closed (disconnectedJavaScript istemcilerinde olay işleyicisi) yöntemini çağırabilirsinizStart. Sunucu veya fiziksel bağlantı kullanılamadığında bunu çok sık yapmaktan kaçınmak için aramadan Start önce 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 bilgisi olan hizmet reddi (DOS) koruması 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: olayda disconnect erişimlastError.

$.connection.hub.disconnected(function () {
    if ($.connection.hub.lastError) 
        { alert("Disconnected. Reason: " +  $.connection.hub.lastError.message); }
});