1. 程式人生 > >C# BS訊息推送 SignalR Hubs環境搭建與開發(二)

C# BS訊息推送 SignalR Hubs環境搭建與開發(二)

原文: C# BS訊息推送 SignalR Hubs環境搭建與開發(二)

1. 前言

本文是根據網上前人的總結得出的。

環境: SignalR2.x,VS2015,Win10

 

2. 開始開發

1)新建一個MVC專案,叫做SignalRDemo

image

2)安裝SignalR包

Install-Package Microsoft.AspNet.SignalR

Install-Package Microsoft.AspNet.SignalR.Client

安裝完包後會有相應的引用和js檔案

image

image

3)新建startup檔案,用來啟動SignalR

image

程式碼如下:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(SignalRDemo.SignalR.StartupSignalR))]

namespace SignalRDemo.SignalR
{
    public class StartupSignalR
    {
        public void Configuration(IAppBuilder app)
        {
            
// 有關如何配置應用程式的詳細資訊,請訪問 http://go.microsoft.com/fwlink/?LinkID=316888 app.MapSignalR();//啟動SignalR } } }

4)新建Hub類,MyHub。此類的作用是用來與客戶端的連線。

可以看到[HubName("myHub")]的註解,是用來與前端JS做繫結

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; namespace SignalRDemo.SignalR { [HubName("myHub")] public class MyHub : Hub { //當連線hub例項時被呼叫 public override Task OnConnected() { string connId = Context.ConnectionId; return base.OnConnected(); } //當失去連線或連結超時時被呼叫 public override Task OnDisconnected(bool stopCalled) { //stopCalled=true時,客戶端關閉連線 //stopCalled=false時,出現連結超時 return base.OnDisconnected(stopCalled); } //重新連線時被呼叫 public override Task OnReconnected() { return base.OnReconnected(); } } }

上面已經新建了與前端連線類。下面我們開始不同的呼叫方式

至此,我們建立環境已經結束。

 

3. 不同調用方式

1)前端呼叫後端

前端html:

myHub是HubName註解屬性。2個js一定要引用:Jquery、SignalR。scripts中有src='/SignalR/hubs',其中SignalR是我們伺服器端的資料夾,hubs是不存在的資料夾。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8"/>
    <script src="/scripts/jquery-1.10.2.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="/scripts/jquery.signalR-2.2.1.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src='/SignalR/hubs'></script>
    <!--Add script to update the page and send messages.-->
    <script type='text/javascript'>
        $(function () {
            //引用自動生成的代理,myHub是HubName註解屬性
            var myHub = $.connection.myHub;
            //開始連線
            $.connection.hub.start().done(function () {
                //客戶端傳送資訊到伺服器
                myHub.server.Send($.connection.hub.id);
            });
        });
    </script>
</head>
<body>

</body>
</html>

後端MyHub類中,新增方法:

       //客戶端傳送資訊到伺服器
        public void Send(string message)
       {
            
       }

訪問html,就能直接呼叫Send方法了。

至此,前端呼叫後端,結束。

 

2)後端主動呼叫前端

前端程式碼,增加了後端呼叫前端JS

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <meta charset="utf-8"/>
    <script src="/scripts/jquery-1.10.2.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="/scripts/jquery.signalR-2.2.1.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src='/SignalR/hubs'></script>
    <!--Add script to update the page and send messages.-->
    <script type='text/javascript'>
        $(function () {
            //引用自動生成的代理,myHub是HubName註解屬性
            var myHub = $.connection.myHub;

            //後端呼叫前端
            myHub.client.serverSend2Client = function (message) {
                console.log("serverSend2Client message=" + message);
            };

            //開始連線
            $.connection.hub.start().done(function () {
                //客戶端傳送資訊到伺服器
                myHub.server.send($.connection.hub.id);
                console.log("connection.hub.id=" + $.connection.hub.id);
            });
        });
    </script>
</head>
<body>

</body>
</html>

後端程式碼:

我們新建一個Notifier的靜態類,好處是讓其他類可以靈活地呼叫,你也可以把方法寫在Hub類中

serverSend2Client方法是與前端繫結的JS方法,可以看到前端也有此方法。

    public static class Notifier
    {
        private static readonly IHubContext Context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

        public static void ServerSend2ClientMethod(string connectionId, string message)
        {
            //註冊後端與前端的方法serverSend2Client。connectionId是判斷髮送給哪個前端
            Context.Clients.Client(connectionId).serverSend2Client(message);
        }

    }

我們在Controller中,新增程式碼,達到,後端主動呼叫前端的目的。

注意,connectionId在後端與前端後可以獲取。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SignalRDemo.SignalR;

namespace SignalRDemo.Controllers
{
    public class DefaultController : Controller
    {
        // GET: Default
        public ActionResult Index()
        {
            //接收connId,connId是前端與後端連通的唯一標識
            string connId = Request["connId"] ?? "";
            //呼叫 後端主動呼叫前端的方法
            Notifier.ServerSend2ClientMethod(connId, Math.Round(1000.0) + "");

            return View();
        }
    }
}

至此,後端主動呼叫前端程式碼結束。

 

程式碼下載地址GitHub  https://github.com/cjt321/SignalRDemo

如果你的部署是負載均衡,多臺伺服器,可以檢視Redis與SignalR的配置。C# BS訊息推送 負載均衡-SignalR&Redis的配置(三)

 

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。