ASP.NET SignaiR 實現消息的即時推送,並使用Push.js實現通知

来源:http://www.cnblogs.com/songjl/archive/2017/01/02/6242751.html
-Advertisement-
Play Games

一.使用背景 1. SignalR是什麼? ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能添加到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連接的客戶端變得可用時伺服器代碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求 ...


一.使用背景

1. SignalR是什麼?

ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能添加到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連接的客戶端變得可用時伺服器代碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求新的數據。

【百度百科】

2.Push.js是什麼?【需要瀏覽器支持H5Notifications】

Notifications翻譯過來即是通知。那麼Push.js的通知又是什麼樣的,見下圖:大多數在屏幕的右下角出現。

需要允許哦:

3.很多時候我們只能使用輪詢的方式進行數據展示的更新和消息推送。於是就想到有沒有一種方式可以完成服務端數據更新時同步更新客戶端的一種解決方案。

二.開始部署一個 SignalR項目【使用mvc】

   1.新建mvc項目

    .....................

   2.導入程式包【Vs2015】
     工具->NuGet包管理器-> 程式包管理控制台->Install-Package Microsoft.AspNet.SignalR->等待安裝成功

   3.新建集線器類

    項目->右鍵->添加->新建項->SignalR->SignalR 永久鏈接類->保存->【以MyConnection1為例】MyConnection1

 public class MyConnection1 : PersistentConnection
    {
        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="connectionId"></param>
        /// <returns></returns>
        protected override Task OnConnected(IRequest request, string connectionId)
        {
            Debug.WriteLine(connectionId);
            return Connection.Send(connectionId, "Welcome!");//單推事列
        }

        /// <summary>
        /// 接受客戶端消息
        /// </summary>
        /// <param name="request"></param>
        /// <param name="connectionId"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            Debug.WriteLine(data);
            return Connection.Broadcast(data);//廣播
        }
        /// <summary>
        /// 掉線
        /// </summary>
        /// <param name="request"></param>
        /// <param name="connectionId"></param>
        /// <param name="stopCalled"></param>
        /// <returns></returns>
        protected override Task OnDisconnected(IRequest request, string connectionId, bool stopCalled)
        {
            Debug.WriteLine("掉線");
            return base.OnDisconnected(request, connectionId, stopCalled);
        }

        /// <summary>
        /// 重連
        /// </summary>
        /// <param name="request"></param>
        /// <param name="connectionId"></param>
        /// <returns></returns>
        protected override Task OnReconnected(IRequest request, string connectionId)
        {
            Debug.WriteLine("重連");
            return base.OnReconnected(request, connectionId);
        }
    }

 

   4.新建 Owin Startup 類【SignalR遵循Owin標準,Startup則是組件的啟動,預設會存在Startup類,只需修改即可】

    我們在Configuration裡面追加以下代碼

   

        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR<MyConnection1>("/myconnection");
        }

   解釋:訪問myconnection的時候,觸發MyConnection1

   5.增加客戶端【h5】

@{
    ViewBag.Title = "Home Page";
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <meta charset="utf-8" />
</head>
<body>
    <script src="~/Scripts/jquery-1.10.2.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.js"></script>
    <script type="text/javascript">
        var conn = $.connection("/myconnection");

        conn.start().done(function (data) {
            console.log("已連接伺服器,當前GUID為" + data.id);
            conn.send("To Admin");//發送給伺服器
        });

        //接受伺服器的推送
        conn.received(function (data) {
            console.log("伺服器返回消息" + data);
        });
    </script>
</body>
</html>

6.啟動項目 打開瀏覽器控制台,你會發現見下圖、這就表示你已經完成了第一步。

 7.下麵我們需要準備 push.js

下載地址 https://github.com/Nickersoft/push.js

8.引用js

 

    <script src="../Js/push.js"></script>

9.新建js推送demo

    function push(data, url, img) {
        var imgurl = img != "" ? img : "../Images/icon.png";
        Push.create("新通知", {
            body: data,
            icon: imgurl,
            requireInteraction: true,
            onClick: function () {
                window.focus();
                this.close();
                window.location.href =url;
            }
        });
    }

解釋:data:為消息內容 

url:為點擊通知進入的鏈接 

img: 為通知展示的圖片地址 

requireInteraction: 設置為true時,除非用戶手動關閉或單擊該通知,否則該通知不會關閉。需要設置消失時間請替換該屬性為timeout: 5000 單位毫秒 

其他事件請閱讀:https://www.npmjs.com/package/push.js

10.組合兩者

    //實時推送
    var conn = $.connection("/myconnection");

    conn.start().done(function (data) {
        console.log("已連接伺服器,當前GUID為" + data.id);
    });

    //接受伺服器的推送
    conn.received(function (msg) {
        console.log("伺服器返回消息: " + msg);
        if (msg != "") {
            push(msg, "#", "")
        }
    });

11.效果如下:

12.實現伺服器的主動推送.現只介紹廣播。單推原理一致。

分為廣播及單推兩種模式。

廣播:

    var context = GlobalHost.ConnectionManager.GetConnectionContext<MyConnection1>();//獲取你當前的Connection連接
    context.Connection.Broadcast("我是一條新的推送消息!");//廣播推送

單推:

 var context = GlobalHost.ConnectionManager.GetConnectionContext<MyConnection1>();//獲取你當前的Connection連接
 context.Connection.Send(connectionId, "Welcome!");//單推事列

connectionId:是服務端為每個客戶端分配的GUID

 

 13.效果如下:

這樣當我們服務端處理某個任務時就可以調用廣播來實現主動推送到客戶端,進行數據的即時更新及消息的推送。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 2017年就這麼悄無聲息的開始了,2017年對我來說又是特別重要的一年。 元旦放假在家寫了個Asp.net Core驗證碼登錄, 做demo的過程中遇到兩個小問題,第一是在Asp.net Core中引用dll,以往我們引用DLL都是直接引用,在Core里這樣是不行的,必須基於NuGet添加,或 ...
  • 本文向大家介紹瞭如何運用C#來創建、安裝、卸載、調試Windows Service程式。有需要的可以參考下,希望對大家有所幫助。 ...
  • 網上看到的很多winform窗體圓角設計代碼都比較累贅,這裡分享一個少量代碼就可以實現的圓角。主要運用了System.Drawing.Drawing2D。 效果圖 代碼如下。 代碼比較簡單,希望有所幫助。 ...
  • var: 初始化必須有賦值,var i;(錯的)。 var類型的對象運行過程中不允許再更改類型。(如:var i=1; i="hello!" 會出錯) var只聲明局部變數。 dynamic: 初始化時可以不賦值。 dynamic類型的對象運行過程中可以給該類型。(如:dynamic i=1; i=... ...
  • 阿裡雲直播SDK的坑 1、直播雲沒有單獨的SDK,直播部分被封裝在CDN的相關SDK當中。 2、針對SDK,沒有相關Demo。 3、針對SDK,沒有相關的文檔說明。 4、針對SDK的說明,官網上的說明與源碼裡面的說明完全不一致,初始化 與源代碼文檔中的 完全不一致。 5、針對SDK沒有封裝哪些是常用 ...
  • hello ...
  • 本文詳細介紹了C#製作簡易屏保的步驟,以及筆者在學習過程中的一些心得,有需要的可以參考下。 ...
  • Redis 安裝 & 配置 本測試環境將在 CentOS 7 x64 上安裝最新版本的 Redis。 1. 運行以下命令安裝 Redis 如果 CentOS 上提示 wget 命令未找到,則先安裝 net-tools。 yum install net-tools 2. Redis 配置文件 1)開啟 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...