1. 程式人生 > >史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式

史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式

1、概述

通過上篇史上最全面的SignalR系列教程-1、認識SignalR文章的介紹,我們對SignalR技術已經有了一個全面的瞭解。本篇開始就通過SignalR的典型應用的實現方式做介紹,例子雖然簡單,但麻雀雖小五臟俱全。可以以此為基礎,擴充套件到實際應用中。

SignalR 的實現機制與.NET WCF 或 Remoting 是相似的,都是使用遠端代理來實現。在具體使用上,有兩種不同通訊模型:PersistentConnection 和 Hubs,其中 PersistentConnection 是實現了長時間的 Javascript 輪詢(類似於 Comet),Hub 是用來解決實時資訊交換問題,它是利用 Javascript 動態載入執行方法實現的。SignalR 將整個連線,資訊交換過程封裝得非常漂亮,客戶端與伺服器端全部使用 JSON 來交換資料。

對於這兩種方式的討論,感興趣的朋友可以移步:https://stackoverflow.com/questions/9280484/signalr-why-choose-hub-vs-persistent-connection

本篇主要介紹使用SignalR的永久連線類(Persistent Connections)的實現方式來實現訊息推送(廣播)功能,分別以Asp.NET MVC與控制檯程式做例項演示。對於Hubs這種集線器的實現方式在下篇文章介紹。

2、SignalR的永久連線類Mvc實現

在ASP.NET MVC下實現SignalR的永久連線類非常的簡單,只需簡單4步就可以實現一個簡單的群聊功能。

2.1、 建立ASP.NET Mvc專案

2.2、安裝Nuget包

建立好專案後,要使用SignalR,需要先安裝SignalR包,可以通過程式包管理控制檯輸入包安裝命令進行安裝。

Install-Package Microsoft.AspNet.SignalR

也可以使用介面方式,如下圖所示。

2.3、增加SignalR服務

規劃適當的SignalR服務檔案存放的資料夾,如我們放在Connections資料夾中,在此資料夾右鍵選擇新建項,我們選擇SignalR Persistent Connection Class永久連線類項。

確定後,VS會自動給我們生成對應程式碼,如下:

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
 
namespace SignalRTestProj_1.Connections
{
    public class ChatConnection : PersistentConnection
    {
        protected override Task OnConnected(IRequest request, string connectionId)
        {
            return Connection.Send(connectionId, "Welcome!");
        }
 
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            return Connection.Broadcast(data);
        }
    }
}

我們對程式碼做適當修改,讓業務更人性化,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;


namespace SignalRTestProj_1.Connections
{
    using Microsoft.AspNet.SignalR;

    public class ChatConnection : PersistentConnection
    {
        private static int _connections = 0;

        protected override Task OnConnected(IRequest request, string connectionId)
        {
            Interlocked.Increment(ref _connections);
            //廣播訊息
            Connection.Broadcast("新的連線加入,連線ID:" + connectionId + ",已有連線數:" + _connections);
            return Connection.Send(connectionId, "雙向連線成功,連線ID:" + connectionId);
        }

        /// <summary>
        /// 連線斷開 
        /// </summary>
        protected override Task OnDisconnected(IRequest request, string connectionId, bool stopCalled)
        {
            Interlocked.Decrement(ref _connections);
            return Connection.Broadcast(connectionId + "退出連線,已有連線數:" + _connections);
        }

        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            var message = connectionId + "傳送內容>>" + data;
            return Connection.Broadcast(message);
        }
    }
}

2.4、啟動路由註冊

要使Signal啟作用,我們必須啟動路由註冊,要讓客戶端能找到,我們使用Owin。如下圖所示,我們新增一個Owin Start啟動類。

using Microsoft.Owin;
using Owin;
using SignalRTestProj_1.Connections;

[assembly: OwinStartup(typeof(SignalRTestProj_1.App_Start.ChartStartup))]

namespace SignalRTestProj_1.App_Start
{
    public class ChartStartup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有關如何配置應用程式的詳細資訊,請訪問 https://go.microsoft.com/fwlink/?LinkID=316888
            // 配置上文實現的ChatConnections
            app.MapSignalR<ChatConnection>("/Connections/ChatConnection");
        }
    }
}

至此,我們服務端就算搭建起來了,現在我們增加一個頁面來實現呼叫。

2.5、前端介面處理

前端js實現訊息廣播,並實時記錄

<html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>SignalR永久連線類 Demo</title>
        <script src="~/Scripts/jquery-3.3.1.min.js"></script>
        <script src="~/Scripts/jquery.signalR-2.4.1.min.js"></script>
    </head>
    <body>
        <div>
            <h1>SignalR永久連線類 Demo</h1>
            <div>
                <input type="text" id="msgContext" placeholder="請輸入訊息內容...." />
                <button id="sendMessage" class="btn-primary">Send</button>            
                <ul id="messages"></ul>
            </div>
            <script>
                var connection = $.connection("/Connections/ChatConnection");
                connection.logging = true;
                //客戶端接收訊息
                connection.received(function (data) {
                    $('#messages').append('<li>' + data + '</li>');
                });
                //連線錯誤處理
                connection.error(function (err) {
                    alert('與伺服器連線報錯:'+ err.message);
                });
                //連線成功
                connection.start().done(function () {
                    $('#sendMessage').click(function () {
                        var val = $('#msgContext').val();
                        //向伺服器端傳送訊息
                        connection.send(val);
                    });
                });
            </script>
        </div>
    </body>
</html>

OK,全面完成,F5執行看效果吧。

2.6、效果展示

3、控制檯做SignalR服務端實現

除了Web實時應用之外,我們還可以用其他應用程式實現實時互動,如控制檯。
只需要Install-Package Microsoft.AspNet.SignalR.Client命令,示例程式碼如下:

using Microsoft.AspNet.SignalR.Client;
using static System.Console;

namespace ClientWithSignalRDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var connection = new Connection("http://localhost:65309/Connections/ChatConnection");

            connection.Received += WriteLine;
            connection.Start().Wait();

            string line;
            while ((line = ReadLine()) != null)
            {
                connection.Send(line).Wait();
            }
        }
    }
}

4、程式碼下載

例項原始碼可以移步github下載,地址:https://github.com/yonghu86/SignalRTestProj

5、參考文章

  • 史上最全面的SignalR系列教程-1、認識SignalR

  • Real-time ASP.NET with SignalR

  • HTML5 WebSocket

  • WebSocket WebAPI

  • 微信公眾號開發系列-玩轉微信開發-目錄彙總

  • RDIFramework.NET — 基於.NET的快速資訊化系統開發框架 — 系列目錄

  • RDIFramework.NET ━ .NET快速資訊化系統開發框架 ━ 工作流程元件介紹

  • RDIFramework.NET框架SOA解決方案(集Windows服務、WinForm形式與IIS形式釋出)-分散式應用

  • RDIFramework.NET程式碼生成器全新V3.5版本釋出-重大升級


一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址瞭解詳情。

RDIFramework.NET官方網站:http://www.rdiframework.net/

RDIFramework.NET官方部落格:http://blog.rdiframework.net/

同時需要說明的,以後的所有技術文章以官方網站為準,歡迎大家收藏!

RDIFramework.NET框架由海南國思軟體科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用!

歡迎關注RDIFramework.net框架官方公眾微信(微訊號:guosisoft),及時瞭解最新動態。

掃描二維碼立即關注