首頁 >後端開發 >C#.Net教程 >ASP.NET MVC中SignalR用法講解

ASP.NET MVC中SignalR用法講解

巴扎黑
巴扎黑原創
2017-08-06 10:44:502738瀏覽

這篇文章主要為大家詳細介紹了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(&#39;<li><strong style="color:green">&#39;+name+&#39;</strong>:&#39;+message+&#39;</li>&#39;); 
      } 
      //设置焦点到输入框 
      $(&#39;#message&#39;).focus(); 
      //开始连接服务器 
      $.connection.hub.start().done(function () { 
        $(&#39;#sendmessage&#39;).click(function () { 
          //调用服务器端集线器的Send方法 
          chat.server.sendMsg($(&#39;#message&#39;).val()); 
          //清空输入框信息并获取焦点 
          $("#message").val(&#39;&#39;).focus(); 
        }) 
      }) 
    }); 
  </script> 
}

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



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

#還記得這句嗎?

8b2371a03fdb411826580abeb4a48a242cacc6d41bbb37262a98f745aa00fbf0

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);
        });
      });

運行效果

#############從上面兩張圖可以看出,客戶端實作了分組###

以上是ASP.NET MVC中SignalR用法講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn