asp.net mvc 實現簡單的實時消息推送

来源:http://www.cnblogs.com/ZERO-TAO/archive/2016/07/28/5713254.html
-Advertisement-
Play Games

因為項目需要,需要在網頁上實現消息的推送。在百度上搜索了一下,發現實現網頁上的消息推送,可以使用asp.net 中的SignalR類庫,當然也可以使用H5的WebSocket Ajax的輪迴。當然此處我們使用asp.net 中的SignalR類庫。因為它可以實現網頁上消息的實時推送。什麼是實時推送呢 ...


       因為項目需要,需要在網頁上實現消息的推送。在百度上搜索了一下,發現實現網頁上的消息推送,可以使用asp.net 中的SignalR類庫,當然也可以使用H5的WebSocket  Ajax的輪迴。當然此處我們使用asp.net 中的SignalR類庫。因為它可以實現網頁上消息的實時推送。什麼是實時推送呢,我簡單的說一下我個人的理解吧。實時:在同一時間類發生的事情,當然在電腦中並不是絕對的實時,因為CPU在同一時間片只能處理一個任務,那麼這個時候疑問又來了?我們平時使用電腦又上網,又聽音樂是如何實現的呢,因為現在的CPU的計算速度很快。CPU會把處理不同的任務的時間片,CPU會把時間片划到很小,很小,小到我們人類感知不到。比如在現在這個時間片上,CPU正在處理音樂任務,在下一個時間片的時候,CPU又在處理上網任務。所以我認為在電腦並沒有絕對的實時,只是我們人類感知不到罷了。推送:在此處的推送是指在網頁消息推送。例如:用戶A和B分別在各自的電腦打開打開一個相同的消息推送網頁。假設用戶A現在向用戶B發送消息。就要經歷一個這樣的過程 用戶A->Server->用戶B。當然具體的底層實現過程,我就不在些探討了哈。因為這個不是現在所要探討的主題。因為Server有地址一般是固定不變的。所以客戶端向伺服器發送消息比較容易,因為目的地址固定。那伺服器如何向客戶端發送消息呢,這個就有點難道了因為客戶端的地址不固定的,並且http是無狀態的是不能記住用戶的地址的。所以為瞭解決這一個問題。電腦的先輩們用到了幾個方法,1、客戶端"心跳"。每隔一段時間去訪問伺服器,看看伺服器有沒有任務給其客戶端。Ajax的輪迴就是使用的這個方法。缺點就是實時性不太高。2、服務端和客戶端的長連接,本文所要談到的SignalR就是用的這種思想。缺點:伺服器的壓力大。

      好了,現在就說一下什麼是SignalR吧。SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能添加到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連接的客戶端變得可用時伺服器代碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求新的數據。這個也就實現消息的實時推送。我個人理解的實現原理是首先由伺服器定製一個函數用於一個客戶端調用將消息發送給另一個客戶端。當然客戶端也需要定抽一個函數。因為伺服器需要調用客戶端的這個函數。

    下麵就說下具體的操作方法吧。

     1、環境:win 10+VS2015 社區版

     我使用asp.net mvc。首先打開VS 2015|文件|新建|項目(SignalRMvc)|asp.net Web應用程式|空模板,MVC,平臺大概就是這樣了。

     現在說下具體需要包含的文件吧。

     1、SignalR集線器類。用於寫一個訪求調用客戶段的函數。

     2、OWIN類。用於註冊伺服器的函數。

     3、前臺的頁面(包括前臺的消息框的編寫,函數的編寫)當然前臺需要一些文件。

    一般VS沒有自帶SignalR類,需要我們在開始任務之前去添加這個功能。選擇VS的工具|Nuget包管理器|Nuget包管理器控制台|Install-Package Microsoft.Aspnet.SignalR去安裝SignalR。安裝完成後,1、我們在改項目中新建一個文件夾為ChatHubs|新建一個SignalR集線器類,並寫上如下代碼:

using Microsoft.AspNet.SignalR;

namespace SignalRMvc.ChatHubs
{
    public class ChatHub : Hub
    {
        public void SendMessage(string name,string message)
        {
            //  Clients.All.hello();
            Clients.All.receiveMessage(name, message);
            //用戶調用客戶端的函數
        }
    }
}
服務端代碼

 2、在ChatHubs文件夾下新建一個OWIN類。並寫上如下代碼:

using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(SignalRMvc.ChatHubs.Startup))]

namespace SignalRMvc.ChatHubs
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
            //伺服器的hub註冊
        }
    }
}
OWIN類的代碼

3、在Controllers新建一個Home控制器。並寫上如下代碼:

using System.Web.Mvc;

namespace SignalRMvc.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult ClientChat()
        {
            return View();
        }
    }
}
控制器的代碼

4、在控制器的方法上右擊添加視圖(不使用模板,也不使用佈局頁)後。並寫上如下代碼:

@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <meta charset="utf-8" />
    <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
    @* BootStarp的引入*@
    <style>
        #message_box {
            height: 400px;
            overflow-y: scroll;
        }
    </style>
    @* 呈現消息 *@
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="jumbotron">
                <ul id="message_box"></ul>
            </div>
            發送者名稱:<input id="text_name" class="form-control" /><br />
            消息內容:
            <textarea id="text_message" class="form-control" rows="3"></textarea>
            <br />
            <button id="btn_send" class="btn btn-block btn-success">Send</button>
        </div>
    </div>

    <script src="~/scripts/jquery-3.1.0.min.js"></script>
    <script src="~/scripts/jquery.signalR-2.2.1.min.js"></script>
    @* 上述引入的兩個文件的順序不以交換,因為下麵這個文件依賴於上面那個文件 *@
    <script src="~/signalr/hubs"></script>
    <!-- 本地沒有,動態生成 -->
    <script>
        $(function () {
            var $messageBox = $('#message_box');
            var $textMessage = $('#text_message');
            var $textName = $('#text_name');
            //客戶端先與伺服器連接起來,拿到伺服器的代理操作對象
            var hubConnection = $.connection.chatHub;
            //註冊客戶端函數
                hubConnection.client.receiveMessage = function (name, message) {
                $messageBox.append('<li><b>' + name + '</b> say:' + message + '</li>')
            }

            //啟動連接到伺服器
            $.connection.hub.start().done(function () {
                $('#btn_send').bind('click', function () {
                    //調用服務端的函數
                    hubConnection.server.sendMessage($textName.val(), $textMessage.val());
                });
            });
        });
    </script>
</body>
</html>
前臺的代碼

如果直接複製使用。要註意前臺的代碼引入的文件的目錄及版本。前臺代碼的命名的首字母最好使用小寫,後臺代碼的首字母最好使用大寫。因為js預設使用的是駝峰命名法,C Sharp使用帕斯卡命名方式。如果沒有註重這個細節就會很容易出錯。因為後臺代碼在執行的時候會動態的生成一些JS代碼,JS代碼的預設使用的駝峰命名法。如果你在前臺的代碼用了帕斯卡命名方式就很容易出錯了。並且還不好找。我是有過親身經歷的。

下麵我們在本地測試下:分別使用FireFox和Chrome來模擬兩個客戶端,當然自身的電腦也就服務端。效果圖如下:

當然我是一個菜鳥中的菜鳥哈。肯定有許多理解的不對的地方。希望各位大神們指出哈。

補充一下,大家可以參考asp.net的官網哈。http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc。當然也可以看一下相關的視頻哈,我看就是傳智播客上的視頻哈,代碼也是跟視頻一步一步走的。不是打廣告哈,只是單純的技術分享。寫篇博客出來就是為了具體的方法思路整理出來,當然也是為了寫一下自己對這個東西的理解吧。

 


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

-Advertisement-
Play Games
更多相關文章
  • 有網友說無法使用My97日期控制項,Insus.NET測試一下,是可以正常使用了。在ASP.NET MVC環境中測試。去官網下載My97日期控制項程式包: 下載解壓之後,把程式的目錄拷貝至project的中Content目錄下: 在控制器,創建一個視圖Action: 在視圖中: @{ Layout = ...
  • 之前也寫過一篇這樣的博文,但是非常的粗糙。 博文地址 後來看到了一位前輩(@勤快的小熊)對我的博文的評論後,讓我看到了更加優雅的實現方式; 代碼如下: 1 public static List<T> ConvertToList<T>(DataTable dt) 2 { 3 List<T> list ...
  • 因為公司的老伺服器用的是Windows 2008 32位,不得不安裝Redis32位。可在微軟的Github上有64位的MSI安裝包,前天開始在不同的群里尋找32位的安裝包,一直沒找到,索性自己下載源碼,安裝VS2013 SP5,編譯了一份Windows32位的服務程式,同時加上了安裝和卸載服務的b ...
  • 問題:安裝過程老是報:安裝包丟失或者損壞,但是去虛擬光碟機裡面可以查找到該安裝包。 解決:可能文件下載ISO過程中丟失了一些數據。使用“Hash(MD5校驗工具)”檢測文件的“SHA-1”值,然後與官網提供的值比對一下,如果不一樣,說明下載的iso有問題。官網地址:SHA-1 值。我之前使用百度雲下載 ...
  • 昨天給大家介紹了實體FluentValidation驗證,今天繼續給大家介紹表單驗證,在Rookey.Frame框架中,表單驗證有PrimaryKeyFields欄位驗證、唯一驗證、必填驗證、常用驗證及自定義驗證,PrimaryKeyFields欄位驗證昨天也略微介紹了下PrimaryKeyFiel ...
  • 數組:具有相同類型的若幹變數按有序的形式組織起來的一種形式。這些按序排列的同類數據元素的集合稱為數組。定義數組 int[] 變數名 = new int [n]; string[] myStringArray = new string[6]; int[] myArray = new int[] {1, ...
  • 現在是一個信息時代,並且正在高速發展.以前獲取信息的途徑非常少,可能只有電視臺,收音機等有限的來源,而現在的途徑數不勝數,如:QQ,微信,官方網站,個人網站等等 本開發手冊是基於聚合數據編寫開發的,其作用是將聚合數據開放平臺中的API能夠使用,測試和展示,方便開發員快速開發.把更多的精力放在業務上... ...
  • 現在是一個信息時代,並且正在高速發展.以前獲取信息的途徑非常少,可能只有電視臺,收音機等有限的來源,而現在的途徑數不勝數,如:QQ,微信,官方網站,個人網站等等 本開發手冊是基於騰訊地圖LBS開放平臺編寫開發的,其作用是將騰訊LBS數據開放平臺中的API能夠使用,測試和展示,方便開發員快速開發.把... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...