首先說明一下這個文章是自己在使用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 }
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 }
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 }
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 }
到此代碼已經貼完了,需要注意的點就是當你做定點推送的時候請去看一下這幾個東西:
用一個名為:c1的登錄
刷新我們的Action:chat1
第一次發博客,也是希望自己能夠多做記錄,多做筆記,希望大家多多交流共同進步。
有不懂的歡迎留言
歡迎拍磚~