Asp.net SignalR 讓實時通訊變得簡單二--把SignalR寄宿到控制台程式中

来源:https://www.cnblogs.com/highest/archive/2018/01/18/8311197.html
-Advertisement-
Play Games

在 Asp.net SignalR 讓實時通訊變得簡單 中思明分享了一個直接寄宿到IIS上的SignalR,SignalR同時也可以宿主在任何應用程式,包括控制台,客戶端程式和Windows服務等,另外還支持Mono,這意味著它可以實現跨平臺部署在Linux環境下。 在我參考的博文 [Asp.net ...


  在 Asp.net SignalR 讓實時通訊變得簡單 中思明分享了一個直接寄宿到IIS上的SignalR,SignalR同時也可以宿主在任何應用程式,包括控制台,客戶端程式和Windows服務等,另外還支持Mono,這意味著它可以實現跨平臺部署在Linux環境下。

  在我參考的博文 [Asp.net 開發系列之SignalR篇]專題一:Asp.net SignalR快速入門 中第四條 在桌面程式中如何使用Asp.net SignalR,就是把SignalR寄宿在WPF客戶端中,我已經親自體驗過了,挺好用的;大家有想瞭解的可以去研究下。今天我在這裡就和大家分享一下直接把SignalR寄宿到控制臺中。

  1、新建一個控制台應用程式

       

       2、右擊先建好的項目---> 選擇管理NuGet程式包-->搜索 Microsoft.Owin.Cors 並安裝-->搜索 Microsoft.AspNet.SignalR.SelfHost 並安裝

  

待安裝好Microsoft.AspNet.SignalR.SelfHost 後VS中會自動彈出readme.txt如下。裡面詳細介紹瞭如何把SignalR寄宿到控制臺上的操作。

  3、我們可以按照readme.txt中的講解。修改Program.cs如下:

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Microsoft.Owin.Hosting;
using Owin;
using System;

namespace SelfSignalRSvc2._0
{
    public class Program
    {
        static void Main(string[] args)
        {
            // This will *ONLY* bind to localhost, if you want to bind to all addresses
            // use http://*:8080 or http://+:8080 to bind to all addresses. 
            // See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx 
            // for more information.

            using (WebApp.Start<Startup>("http://localhost:118/"))
            {
                Console.WriteLine("Server running at http://localhost:118/");
                Console.ReadLine();
            }
        }
    }

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/signalr", map =>
            {
                // Setup the cors middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);

                var hubConfiguration = new HubConfiguration
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };

                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch is already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

  然後直接新建一個類ChatHub,繼承Hub,並實現如下代碼

using Microsoft.AspNet.SignalR;
using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace SelfSignalRSvc
{
    public class ChatHub : Hub
    {
        /// <summary>
        /// 供客戶端調用的伺服器端代碼
        /// </summary>
        /// <param name="message"></param>
        public void Send(string message)
        {
            var name = Context.ConnectionId;
            // 調用所有客戶端的sendMessage方法
            Clients.All.sendMessage(name, message);
        }

        /// <summary>
        /// 客戶端連接的時候調用
        /// </summary>
        /// <returns></returns>
        public override Task OnConnected()
        {
            Trace.WriteLine("客戶端連接成功:" + Context.ConnectionId);
            return base.OnConnected();
        }
    }
}

  4、按照上面的操作,我們已經完成了腳本服務的開發。直接運行VS,控制台啟動成功

  5、下麵我們需要新建一個html代碼來驗證腳本是否可用。

   記得引用  jquery-1.10.2.js 和 jquery.signalR-2.2.2.min.js 同時修改腳本所在鏈接 http://localhost:118/signalr/hubs 和 

        需要指定寄宿的服務地址 $.connection.hub.url = 'http://localhost:118/signalr';

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試控制台程式是否可用</title>
    
</head>
<body>
<h2>Chat</h2>

<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion"></ul>
</div>
<script src="jquery-1.10.2.js"></script>
        <!--引用SignalR庫. -->
    <script src="jquery.signalR-2.2.2.min.js"></script>
     <!--引用自動生成的SignalR 集線器(Hub)腳本.在運行的時候在瀏覽器的Source下可看到 -->
     <script src="http://localhost:118/signalr/hubs"></script>
    <script>
        $(function () {
            // 1、引用自動生成的集線器代理 需要指定寄宿的服務地址
            $.connection.hub.url = 'http://localhost:118/signalr';
             var chat = $.connection.chatHub;

            // 2、開始連接伺服器 done函數表明建立連接成功後為發送按鈕註冊了一個click事件
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    // 調用伺服器端集線器的Send方法 也要小寫開頭
                    chat.server.send($('#message').val());
                    // 清空輸入框信息並獲取焦點
                    $('#message').val('').focus();
                });
            });

            // 3、定義伺服器端調用的客戶端sendMessage來顯示新消息
            chat.client.sendMessage = function (name, message) {
                // 向頁面添加消息
                $('#discussion').append('<li><strong>' + htmlEncode(name)
                    + '</strong>: ' + htmlEncode(message) + '</li>');
            };

            // 設置焦點到輸入框
            $('#message').focus();
        });
        
        // 為顯示的消息進行Html編碼
        function htmlEncode(value) {
            var encodedValue = $('<div />').text(value).html();
            return encodedValue;
        }
    </script>
</body>
</html>

 直接運行網址html頁面 ,打開多個網頁,都可以收到相同的消息。。如下:

 

通過把 signalR寄宿到WPF客戶端已經控制台程式的操作,發現兩者實現都是差不多的。所以在實際使用時大家可以根據自己具體的需求選擇更適合自己的實現方式。

碼字不容易,轉載請註明出處

 


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

-Advertisement-
Play Games
更多相關文章
  • 一個爬取網易國內今日熱點新聞的小腳本。 需要用到requests、BeautifulSoup、Pandas(用於處理數據和導出Excel) 網易國內新聞url:http://news.163.com/domestic/ get url獲得response,requests對象,BeautifulSo ...
  • 本篇文章更適合具有一定開發經驗,一定功底,且對底層代碼有所研究的朋友!!! 本篇文章主要採用理論和代碼實例相結合方式來論述委托和事件,涉及到一些邊界技術,如軟體架構的OCP原則(開-閉原則), 軟體架構解耦,設計模式(Sender-Order)和事件驅動模型,有一定難度和深度,不適合初級者。 第一部 ...
  • 這篇文章其實是老外寫的,我只是把它翻譯一下,因為我用asp.net做上傳,有一個60+M的文件一直上傳不了,查了好多資料都是說把Web.config里的system.web>>httpRuntime節點下的maxRequestLength屬性改大一點,預設是4096kb,但是我照著修改之後並沒有起作 ...
  • using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;u ...
  • 這是從上文的<<圖文並茂的生產者消費者應用實例demo>>整理總結出來的,具體就不說了,直接給出代碼,註釋我已經加了,原來的code請看<<.Net中的並行編程-7.基於BlockingCollection實現高性能非同步隊列>>,我改成適合我的版本了,直接給code: 調用code: 封裝的隊列: ...
  • 前幾步和網上其他教程一樣的。主要是把.net framework 打包進安裝程式里,如果選的是“從與我的應用程式相同的位置下載系統必備組件”,會提示 ERROR: 要在“系統必備”對話框中啟用“從與我的應用程式相同的位置下載系統必備組件”,必須將“Microsoft .NET Framework 4 ...
  • 首先本地得有網路 運行 "cmd"命令: 輸入"ipconfig": 拿到自己的IP地址 將要測試的項目在iis中配置好 index.aspx是首頁,也就是二維碼頁面 生成二維碼(index.aspx.cs頁面,基於QRCoder生成): 掃描生成的二維碼就自動跳到要測試的頁面了 ...
  • 上一篇講解了拼團提醒邏輯功能實現,現在繼續實現頁面功能。 Core項目 打開AbpZeroTemplate-zh-CN.xml語言文件,在末尾添加如下代碼: 文件路徑:D:\abp version\aspnet-zero-3.4.0\aspnet-zero-3.4.0\src\MyCompanyNa ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...