ASP.NET MVC中SignalR用法講解

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了ASP.NET MVC中SignalR的簡單應用,具有一定的參考價值,感興趣的小夥伴們可以參考一下

一、簡介

ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將即時 Web 功能添加到應用程式的過程。即時 Web 功能是指這樣一種功能:當所串連的用戶端變得可用時伺服器代碼可以立即向其推送內容,而不是讓伺服器等待用戶端請求新的資料。——百度百科

  首先ASP.NET SignalR 是一個ASP .NET 下的類庫,可以在ASP .NET 的Web項目中實現即時通訊。讓用戶端(Web頁面)和伺服器端可以互相通知訊息及調用方法。

  SignalR自動處理串連管理,可以讓服務端同時向所有串連的用戶端廣播訊息,比如聊天室。也可以向特定的用戶端發送訊息。用戶端和伺服器之間的串連是持久的,與傳統的HTTP串連不同,它是為每個通訊重建立立的。

  SignalR支援“伺服器推送”功能,其中伺服器代碼可以使用遠端程序呼叫(RPC)呼叫瀏覽器中的用戶端代碼,而不是今天在網路上常見的請求響應模型。

  總之,SignalR是一個運行在.NET 平台上的 html websocket 架構,它出現的主要目的是實現伺服器主動推送(Push)訊息到用戶端頁面

  注意:WebSocket要求伺服器使用Windows Server 2012或Windows 8和.NET Framework 4.5如果不符合這些要求,SignalR將嘗試使用其他傳輸來進行串連

二、安裝

開啟管理NuGet程式包,搜尋SignalR,安裝下面這些程式包


安裝完成後程式中會多出一些引用

三、編寫代碼

因為用的是SignalR2,所以需要建立Startup.cs類,配置集線器,編寫如下


using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(SignalRStartup.Startup))]namespace SignalRStartup{  public class Startup  {    public void Configuration(IAppBuilder app)    {      // 配置集線器       app.MapSignalR();    }  }}

接著編寫服務端的hub類


using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Web;using Microsoft.AspNet.SignalR;namespace signalR{  public class ServerHub : Hub  {    public void SendMsg(string message)    {      //調用所有用戶端的sendMessage方法(sendMessage有2個參數)       Clients.All.sendMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);    }  }}

建立HomoController以及其Action函數Index


using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace signalR.Controllers{  public class HomeController : Controller  {    public ActionResult Index()    {      return View();    }  }}

Index前段代碼


@{   ViewBag.title = "SignaIR聊天視窗"; } <p class="container">   <input type="text" id="message" />   <input type="button" id="sendmessage" value="biubiu" />   <ul id="messageBox"></ul> </p> @section scripts {   <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>   <script src="~/signalr/hubs"></script>   <script>     $(function () {       //引用自動產生的集線器代理       var chat = $.connection.serverHub;       //定義伺服器調用的用戶端sendMessage來顯示新訊息       chat.client.sendMessage = function (name, message)       {         //向頁面添加訊息         $("#messageBox").append('<li><strong style="color:green">'+name+'</strong>:'+message+'</li>');       }       //設定焦點到輸入框       $('#message').focus();       //開始串連伺服器       $.connection.hub.start().done(function () {         $('#sendmessage').click(function () {           //調用伺服器端集線器的Send方法           chat.server.sendMsg($('#message').val());           //清空輸入框資訊並擷取焦點           $("#message").val('').focus();         })       })     });   </script> }

運行效果,在任何一個視窗發送訊息,其他所有用戶端都能收到該訊息。

運行程式的時候,Web頁面就與SignalR的服務建立了串連,具體的建立串連的代碼就是:$.connection.hub.start()。這句代碼的作用就是與SignalR服務建立串連,後面的done函數表明建立串連成功後為按鈕註冊了一個click事件;也可以用集線器對象chat.connextion.start()

還記得這句嗎?
<script src="~/signalr/hubs"></script>
F12看到的結果

上面的demo中的 Clients.All.sendMessage是調用所有用戶端的sendMessage函數,屬於群發。

下面是一個用戶端分組的demo

服務端代碼


 public void AddToRoom(string groupName, string userName)    {      //將串連添加到指定的組(Groups為HubBase中的介面屬性)      Groups.Add(Context.ConnectionId, groupName);      //根據組名稱擷取對應用戶端的組,調用該組的addUserIn方法      Clients.Group(groupName, new string[0]).addUserIn(groupName, userName);    }    public void Send(string groupName, string detail, string userName)    {      //Clients.All.addSomeMessage(detail);//群發給所有      //調用用戶端某一個組的addSomeMessage      Clients.Group(groupName, new string[0]).addSomeMessage(groupName, detail, userName);    }

用戶端代碼


 chat.client.addSomeMessage = function(groupId, detail, userName) {        console.info("廣播訊息:" + detail);        $("#contentMsg").append("<li>" + userName + ": " + detail + "</li>");      };     chat.client.addUserIn = function(groupId, userName) {        $("#contentMsg").append("<li>" + userName + "進入"+groupId+"號聊天室!</li>");      };      $.connection.hub.logging = true; //啟動signalr狀態功能      $.connection.hub.start().done(function() {        //加入聊天室         $("#joinRoom").click(function() {          var groupId = $("#groupId").val();          var userName = $("#userName").val();          chat.server.addToRoom(groupId, userName);        });        //發送訊息        $("#send").click(function() {          var detail = $("#message").val();          var groupId = $("#groupId").val();          var userName = $("#userName").val();          chat.server.send(groupId, detail, userName);        });      });

運行效果


從上面兩張圖可以看出,用戶端實現了分組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.