在Asp.Net MVC中實現SignalR的廣播與定向推送


首先說明一下這個文章是自己在使用SignalR的時候做個記錄,目的是怕以后忘記了,因為我也不常用,做這樣一個簡單的demo以后用到的時候可以翻翻看。

至於SignalR是個什么玩意呢請您去自行百度一下,這里不過多贅述。

下面直入主題!

場景:

我們有個網站,在登錄界面有個二維碼登錄功能,用戶打開我們的APP點擊掃碼登錄掃描網頁上的二維碼,這個時候我想要在頁面上(網站登錄頁)做點反應,當用戶在APP端掃描完畢之后,網站登錄頁上提示  --用戶掃描已完成,請在手機上確認-- 等字樣。

為了實現這個功能,我第一個想到的就是WebSocket但是考慮到瀏覽器的兼容性,果斷的選擇了SignalR,據說這貨是在客戶端的瀏覽器支持WebSocket的時候就用WebSocket不支持的時候就用long polling

實現流程:

1、用戶打開我們的網站(瀏覽器)在登錄頁面選擇二維碼登錄;

2、用戶打開我們的APP掃描網站登錄頁上面的二維碼(前提是APP處於登錄狀態);

3、用戶掃描完成之后網站的登錄頁面做相應的提示信息顯示。

 

下面是消息處理中心的實現,也是今天的主角

 

1、首先新建一個 .net MVC的項目MessageHub

 

 

 2、然后添加SignalR的引用,直接NuGet搜索SignalR,有很多版本,我這里直接安裝的是最新版的,你也可以選擇安裝2.2.1或者2.2.0

 3、添加引用完成之后,建議你最好看看這個玩意:

 

4、然后在項目中添加一個文件夾,你可以命名為:SignalR,添加我們的第一個Hub,右鍵、添加、新建項、SignalR集線器類(v2)

 

5、修改類中的代碼,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using Microsoft.AspNet.SignalR;
 6 
 7 namespace MessageHub.SignalR
 8 {
 9     public class MyHub1 : Hub
10     {
11         /// <summary>
12         /// 用戶的connectionID與用戶名對照表
13         /// </summary>
14         private readonly static Dictionary<string, string> connections = new Dictionary<string, string>();
15 
16         public void Send(string name, string message)
17         {
18             message = string.Format("消息:{0} 時間:{1}", message, DateTime.Now.ToString());
19             //調用所有客戶端的addNewMessageToPage function  
20             Clients.All.addNewMessageToPage(name, message);
21         }
22 
23         public static void Show(string name, string content)
24         {
25             IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub1>();
26 
27             //廣播,所有連接到服務器的客戶端都會收到該通知
28             string message = "服務器廣播的消息:hello";
29             context.Clients.All.hello(message);
30 
31             //推送到某個用戶
32             string toUserId = "";
33             if (connections.ContainsKey(name))
34             {
35                 toUserId = connections[name];
36                 context.Clients.Client(toUserId).SendMessage(content == "" ? "服務器給你推送消息了" : content);
37             }
38         }
39         /// <summary>
40         /// 用戶上線函數
41         /// </summary>
42         /// <param name="name"></param>
43         public void SendLogin(string name)
44         {
45             if (!connections.ContainsKey(name))
46             {
47                 //這里是將用戶id和姓名聯系起來
48                 connections.Add(name, Context.ConnectionId);
49             }
50             else
51             {
52                 //每次登陸id會發生變化
53                 connections[name] = Context.ConnectionId;
54             }
55         }
56     }
57 }
MyHub1.cs

 

6、在App_Start目錄中添加一個Startup.cs 代碼如下:

 1 using Microsoft.Owin;
 2 using Owin;
 3 
 4 [assembly: OwinStartup(typeof(MessageHub.Startup))]
 5 namespace MessageHub
 6 {
 7     public class Startup
 8     {
 9         public void Configuration(IAppBuilder app)
10         {
11             app.MapSignalR();
12         }
13     }
14 }
Startup.cs

 

7、在HomeController中添加兩個Action Chat、Chat1,chat1就是為了簡單省事的做個服務器定點推送 代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MessageHub.Controllers
 8 {
 9     public class HomeController : Controller
10     {
11         public ActionResult Index()
12         {
13             return View();
14         }
15 
16         public ActionResult About()
17         {
18             ViewBag.Message = "Your application description page.";
19 
20             return View();
21         }
22 
23         public ActionResult Contact()
24         {
25             ViewBag.Message = "Your contact page.";
26 
27             return View();
28         }
29 
30         public ActionResult Chat()
31         {
32             return View();
33         }
34 
35         public ActionResult Chat1()
36         {
37             SignalR.MyHub1.Show("c1", "你去干啥?");
38 
39             return Content("推送消息給客戶端");
40         }
41     }
42 }
HomeController.cs

8、添加Chat視圖:

 1 @{
 2     ViewBag.Title = "Chat";
 3 }
 4 
 5 <h2>Chat</h2>
 6 
 7 <div class="container">
 8     <input type="text" id="message" />
 9     <input type="button" id="sendmessage" value="Send" />
10     <input type="hidden" id="displayname" />
11     <ul id="discussion"></ul>
12 </div>
13 @section scripts {
14     <script src="~/Scripts/jquery-1.10.2.min.js"></script>
15     <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
16     <!--signalr自動生成的腳本-->
17     <script src="~/signalr/hubs"></script>
18     <script>
19 
20         $(function () {
21             //聲明hub代理
22             var chat = $.connection.myHub1;
23             //創建后端要調用的前端function
24             chat.client.addNewMessageToPage = function (name, message) {
25                 //將信息添加到頁面上
26                 $('#discussion').append('<li><strong>' + name + '</strong>:' + message + '</li>');
27             };
28             //對應后端的SendMessage函數,消息接收函數
29             chat.client.sendMessage = function (message) {
30                 $('#discussion').append('<li><strong>' + name + '</strong>:' + message + '</li>');
31             };
32             chat.client.hello = function (message) {
33                 $('#discussion').append('<li><strong>服務器廣播的消息:hello</strong></li>');
34             }
35             //獲取輸入的名稱
36             $('#displayname').val(prompt('Enter your name:', ''));
37             //將焦點定位在信息輸入框中
38             $('#message').focus();
39             //開啟鏈接
40             $.connection.hub.start().done(function () {
41                 var username = $('#displayname').val();
42 
43                 //發送上線信息
44                 chat.server.sendLogin(username);
45 
46                 $('#sendmessage').click(function () {
47                     //調用后台hub的Send方法
48                     chat.server.send($('#displayname').val(), $('#message').val());
49                     //清除發送的內容,並將焦點定位到信息框
50                     $('#message').val('').focus();
51                 });
52             });
53         });
54     </script>
55 }  
Chat

 

到此代碼已經貼完了,需要注意的點就是當你做定點推送的時候請去看一下這幾個東西:

用一個名為:c1的登錄

刷新我們的Action:chat1

 

 

 第一次發博客,也是希望自己能夠多做記錄,多做筆記,希望大家多多交流共同進步。

有不懂的歡迎留言

歡迎拍磚~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM