Öğretici: SignalR 2 ve MVC 5 ile gerçek zamanlı sohbet

Bu öğreticide ASP.NET SignalR 2'yi kullanarak gerçek zamanlı sohbet uygulaması oluşturma adımları gösterilmektedir. SignalR'yi bir MVC 5 uygulamasına ekler ve ileti gönderip görüntülemek için bir sohbet görünümü oluşturursunuz.

Bu öğreticide şunları yaptınız:

  • Projeyi ayarlama
  • Örneği çalıştırma
  • Kodu inceleme

Uyarı

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

Önkoşullar

Projeyi Ayarlama

Bu bölümde Boş bir ASP.NET MVC 5 uygulaması oluşturmak, SignalR kitaplığını eklemek ve sohbet uygulamasını oluşturmak için Visual Studio 2017 ve SignalR 2'nin nasıl kullanılacağı gösterilmektedir.

  1. Visual Studio'da .NET Framework 4.5'i hedefleyen bir C# ASP.NET uygulaması oluşturun, SignalRChat olarak adlandırın ve Tamam'a tıklayın.

    Web oluşturma

  2. Yeni ASP.NET Web Uygulaması - SignalRMvcChat'teMVC'yi ve ardından Kimlik Doğrulamasını Değiştir'i seçin.

  3. Kimlik Doğrulamayı Değiştir'de KimlikDoğrulaması Yok'a tıklayın ve Tamam'a tıklayın.

    Kimlik Doğrulaması Yok'a tıklayın

  4. Yeni ASP.NET Web Uygulaması - SignalRMvcChat bölümünde Tamam'ı seçin.

  5. Çözüm Gezgini'da projeye sağ tıklayın veYeni Öğe Ekle'yi> seçin.

  6. Yeni Öğe Ekle - SignalRChat bölümünde Yüklü>Visual C#>Web>SignalR'yi ve ardından SignalR Hub Sınıfı (v2) öğesini seçin.

  7. Sınıfı ChatHub olarak adlandırın ve projeye ekleyin.

    Bu adım ChatHub.cs sınıf dosyasını oluşturur ve projeye SignalR'yi destekleyen bir dizi betik dosyası ve derleme başvurusu ekler.

  8. Yeni ChatHub.cs sınıf dosyasındaki kodu şu kodla değiştirin:

    using System;
    using System.Web;
    using Microsoft.AspNet.SignalR;
    namespace SignalRChat
    {
        public class ChatHub : Hub
        {
            public void Send(string name, string message)
            {
                // Call the addNewMessageToPage method to update clients.
                Clients.All.addNewMessageToPage(name, message);
            }
        }
    }
    
  9. Çözüm Gezgini'da projeye sağ tıklayın veSınıfEkle'yi> seçin.

  10. Yeni sınıfı Startup olarak adlandırın ve projeye ekleyin.

  11. Startup.cs sınıf dosyasındaki kodu şu kodla değiştirin:

    using Owin;
    using Microsoft.Owin;
    [assembly: OwinStartup(typeof(SignalRChat.Startup))]
    namespace SignalRChat
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // Any connection or hub wire up and configuration should go here
                app.MapSignalR();
            }
        }
    }
    
  12. Çözüm Gezgini'daDenetleyiciler>HomeController.cs'yi seçin.

  13. Bu yöntemi HomeController.cs dosyasına ekleyin.

    public ActionResult Chat()
    {
        return View();
    }
    

    Bu yöntem, sonraki bir adımda oluşturduğunuz Sohbet görünümünü döndürür.

  14. Çözüm GezginiGörünümler>Giriş'e sağ tıklayın veGörünümEkle'yi> seçin.

  15. Görünüm Ekle'de yeni görünümü Sohbet olarak adlandırın ve Ekle'yi seçin.

  16. Chat.cshtml dosyasının içeriğini şu kodla değiştirin:

    @{
        ViewBag.Title = "Chat";
    }
    <h2>Chat</h2>
    <div class="container">
        <input type="text" id="message" />
        <input type="button" id="sendmessage" value="Send" />
        <input type="hidden" id="displayname" />
        <ul id="discussion">
        </ul>
    </div>
    @section scripts {
        <!--Script references. -->
        <!--The jQuery library is required and is referenced by default in _Layout.cshtml. -->
        <!--Reference the SignalR library. -->
        <script src="~/Scripts/jquery.signalR-2.1.0.min.js"></script>
        <!--Reference the autogenerated SignalR hub script. -->
        <script src="~/signalr/hubs"></script>
        <!--SignalR script to update the chat page and send messages.--> 
        <script>
            $(function () {
                // Reference the auto-generated proxy for the hub.  
                var chat = $.connection.chatHub;
                // Create a function that the hub can call back to display messages.
                chat.client.addNewMessageToPage = function (name, message) {
                    // Add the message to the page. 
                    $('#discussion').append('<li><strong>' + htmlEncode(name) 
                        + '</strong>: ' + htmlEncode(message) + '</li>');
                };
                // Get the user name and store it to prepend to messages.
                $('#displayname').val(prompt('Enter your name:', ''));
                // Set initial focus to message input box.  
                $('#message').focus();
                // Start the connection.
                $.connection.hub.start().done(function () {
                    $('#sendmessage').click(function () {
                        // Call the Send method on the hub. 
                        chat.server.send($('#displayname').val(), $('#message').val());
                        // Clear text box and reset focus for next comment. 
                        $('#message').val('').focus();
                    });
                });
            });
            // This optional function html-encodes messages for display in the page.
            function htmlEncode(value) {
                var encodedValue = $('<div />').text(value).html();
                return encodedValue;
            }
        </script>
    }
    
  17. Çözüm Gezgini'daBetikler'i genişletin.

    jQuery ve SignalR için betik kitaplıkları projede görünür.

    Önemli

    Paket yöneticisi SignalR betiklerinin sonraki bir sürümünü yüklemiş olabilir.

  18. Kod bloğundaki betik başvurularının projedeki betik dosyalarının sürümlerine karşılık geldiğini denetleyin.

    Özgün kod bloğundan betik başvuruları:

    <!--Script references. -->
    <!--The jQuery library is required and is referenced by default in _Layout.cshtml. -->
    <!--Reference the SignalR library. -->
    <script src="~/Scripts/jquery.signalR-2.1.0.min.js"></script>
    
  19. Eşleşmiyorsa .cshtml dosyasını güncelleştirin.

  20. Menü çubuğundan Dosya>Tümünü Kaydet'i seçin.

Örneği Çalıştırma

  1. Araç çubuğunda Betik Hata Ayıklama'yı açın ve ardından örneği Hata Ayıklama modunda çalıştırmak için yürüt düğmesini seçin.

    Kullanıcı adını girin

  2. Tarayıcı açıldığında sohbet kimliğiniz için bir ad girin.

  3. Tarayıcıdan URL'yi kopyalayın, iki tarayıcı daha açın ve URL'leri adres çubuklarına yapıştırın.

  4. Her tarayıcıda benzersiz bir ad girin.

  5. Şimdi bir açıklama ekleyin ve Gönder'i seçin. Bunu diğer tarayıcılarda tekrarlayın. Açıklamalar gerçek zamanlı olarak görünür.

    Not

    Bu basit sohbet uygulaması sunucuda tartışma bağlamını korumaz. Merkez, açıklamaları tüm geçerli kullanıcılara yayınlar. Sohbete daha sonra katılan kullanıcılar katıldıkları zamandan eklenen iletileri görür.

    Sohbet uygulamasının üç farklı tarayıcıda nasıl çalıştığını görün. Tom, Anand ve Susan mesaj gönderdiğinde tüm tarayıcılar gerçek zamanlı olarak güncelleştirilir:

    Üç tarayıcı da aynı sohbet geçmişini görüntüler

  6. Çözüm Gezgini'da, çalışan uygulamanın Betik Belgeleri düğümünü inceleyin. SignalR kitaplığının çalışma zamanında oluşturduğu hubs adlı bir betik dosyası vardır. Bu dosya, jQuery betiği ile sunucu tarafı kodu arasındaki iletişimi yönetir.

    Betik Belgeleri düğümünde otomatik olarak oluşturulan hubs betiği

Kodu İnceleme

SignalR sohbet uygulaması iki temel SignalR geliştirme görevini gösterir. Bir hub'ın nasıl oluşturulacağını gösterir. Sunucu, ana koordinasyon nesnesi olarak bu hub'ı kullanır. Hub, iletileri göndermek ve almak için SignalR jQuery kitaplığını kullanır.

ChatHub.cs'de SignalR Hubs

Kod örneğinde sınıfı sınıfından ChatHubMicrosoft.AspNet.SignalR.Hub türetilir. sınıfından Hub türetme, SignalR uygulaması oluşturmanın kullanışlı bir yoludur. Hub sınıfınızda genel yöntemler oluşturabilir ve ardından bunları bir web sayfasındaki betiklerden çağırarak bu yöntemlere erişebilirsiniz.

Sohbet kodunda istemciler yeni bir ileti göndermek için yöntemini çağırır ChatHub.Send . Hub da çağrısı Clients.All.addNewMessageToPageyaparak iletiyi tüm istemcilere gönderir.

yöntemi çeşitli Send hub kavramlarını gösterir:

  • İstemcilerin çağırabilmesi için bir hub'da genel yöntemleri bildirin.

  • Bu hub'a Microsoft.AspNet.SignalR.Hub.Clients bağlı tüm istemcilerle iletişim kurmak için dinamik özelliğini kullanın.

  • İstemcileri güncelleştirmek için istemcide (işlev gibi addNewMessageToPage ) bir işlev çağırın.

    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.addNewMessageToPage(name, message);
        }
    }
    

SignalR ve jQuery Chat.cshtml

Kod örneğindeki Chat.cshtml görünüm dosyası SignalR jQuery kitaplığının bir SignalR hub'ı ile iletişim kurmak için nasıl kullanılacağını gösterir. Kod birçok önemli görevi yürütür. Hub için otomatik olarak oluşturulan ara sunucuya başvuru oluşturur, sunucunun istemcilere içerik göndermek için çağırabileceği bir işlev bildirir ve hub'a ileti göndermek için bir bağlantı başlatır.

var chat = $.connection.chatHub;

Not

JavaScript'te sunucu sınıfına ve üyelerine başvuru camelCase dilindedir. Kod örneği, JavaScript'teki C# ChatHub sınıfına olarak chatHubbaşvurur.

Bu kod bloğunda betikte bir geri çağırma işlevi oluşturursunuz.

chat.client.addNewMessageToPage = function (name, message) {
    // Add the message to the page. 
    $('#discussion').append('<li><strong>' + htmlEncode(name) 
        + '</strong>: ' + htmlEncode(message) + '</li>');
};

Sunucudaki hub sınıfı, her istemciye içerik güncelleştirmeleri göndermek için bu işlevi çağırır. İşleve yönelik htmlEncode isteğe bağlı çağrı, ileti içeriğini sayfada görüntülemeden önce HTML kodlamanın bir yolunu gösterir. Betik eklemeyi önlemenin bir yoludur.

Bu kod hub ile bir bağlantı açar.

$.connection.hub.start().done(function () {
    $('#sendmessage').click(function () {
        // Call the Send method on the hub. 
        chat.server.send($('#displayname').val(), $('#message').val());
        // Clear text box and reset focus for next comment. 
        $('#message').val('').focus();
    });
});

Not

Bu yaklaşım, olay işleyicisi yürütülmeden önce bağlantı kurmanızı sağlar.

Kod bağlantıyı başlatır ve ardından Sohbet sayfasındaki Gönder düğmesinde tıklama olayını işlemek için bir işlev geçirir.

Kodu alma

Tamamlanan Projeyi İndir

Ek kaynaklar

SignalR hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Sonraki adımlar

Bu öğreticide şunları yaptınız:

  • Projeyi ayarlama
  • Örneği çalıştır
  • Kodu inceledim

Yüksek frekanslı mesajlaşma işlevselliği sağlamak için ASP.NET SignalR 2 kullanan bir web uygulaması oluşturmayı öğrenmek için sonraki makaleye ilerleyin.