signalr_signalr 集群部署 - CSDN
精华内容
参与话题
  • 什么是SignalR?   本文转载自:知道91博客 SignalR新手系列教程详解(一)- SignalR介绍 ASP.NET SignalR 是为.NET 开发者提供即时通讯Web 应用的类库。即时通讯Web服务就是服务器将内容自动推送到已经连接的...

    什么是SignalR?

     

    本文转载自:知道91博客 SignalR新手系列教程详解(一)- SignalR介绍

    ASP.NET SignalR 是为.NET 开发者提供即时通讯Web 应用的类库。即时通讯Web服务就是服务器将内容自动推送到已经连接的客户端,而不是服务器等待客户端发起一个新的数据请求。

     

    SignalR能够被运用到各种类型的即时响应应用。你完全可以运用SignalR实现一个在线即时聊天应用。当然SignalR也运用在用户需要随时更新数据的网页运用,比如仪表盘和监控运用,其他协同应用程序(文档协同操作)、工作流更新或者是即时表格。

     

    SignalR同样也被运用在一些需要高频繁从服务器更新的应用,比如实时在线游戏。有个很好的示例可以参考ShootR game

     

    SignalR 提供了使用JavaScript API 方法创建服务器对客户端的远程过程调用协议(RPC)的,它能够让你从客户端浏览器(或者其他平台)从.NET服务端发起远程调用。SignalR 同样提供了管理远程连接和连接组的API方法。

     

    SignalR服务器客户端方法调用原理

    SignalR 不仅能够自动管理连接,而且能够同时向所有的客户端广播消息,就像聊天室一样。你也能够发送消息到指定的客户端。SignalR提供的连接是持久的,它不像传统的HTTP连接需要为每次收发消息建立单独的连接。

     

    SignalR 同时在服务端提供了远程过程调用协议(RPC),让你能够“主动”推送消息到浏览器中的客户端,而不像普通的Web服务一样的应答方式。

     

    SignalR 应用能够运用到成千的客户端上,通过使用服务总线、SQL Server或者Redis

     

    SignalR 是开源的,能够通过GitHub很容易得到。

     

    SignalR 和 WebSocket

    你可以使用SignalR 使用最新的WebSocket 传输,同时也能够让你回退到原有的传输方式。你可以直接使用SignalR 使用 WebSocket,因为SignalR 已经替你封装好许多你需要实现的方法。最重要的是你使用SignalR不用担心为老的客户端实现WebSocket而采用两套不同的逻辑编码方式。使用SignalR 实现WebSocket你不用担心 WebSocket的更新而去修改代码,SignalR会在传输方式上使用WebSocket最新的传输方式,同时提供了一连串的接口能够让你来支持不同版本的客户端。

     

    当你想创建一个纯粹的WebSocket解决方案的时候,SignalR 提供了所有的方法,比如回退到其他传输方式或者更新到WebSocket 的实现方法。

     

    本文转载自:知道91博客 SignalR新手系列教程详解(一)- SignalR介绍

    展开全文
  • Signalr即时通讯Demo

    2020-07-30 23:32:11
    SignalR当然也提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,并且非常 方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用...
  • SignalR实时聊天

    2020-09-24 20:33:00
    2.添加 SignalR 客户端库。 SignalR 服务器库包含在 ASP.NET Core 3.0 共享框架中。 JavaScript 客户端库不会自动包含在项目中。 对于此教程,使用库管理器 (LibMan) 从 unpkg 获取客户端库。 unpkg 是一个内容分发...

    1.创建 Web 项目。

    选择“Web 应用程序”以创建使用 Razor Pages 的项目,然后选择“创建” 。

    2.添加 SignalR 客户端库。

    SignalR 服务器库包含在 ASP.NET Core 3.0 共享框架中。 JavaScript 客户端库不会自动包含在项目中。 对于此教程,使用库管理器 (LibMan) 从 unpkg 获取客户端库。 unpkg 是一个内容分发网络 (CDN),可分发在 npm(即 Node.js 包管理器)中找到的任何内容。

    • 在“解决方案资源管理器”中,右键单击项目,然后选择“添加”>“客户端库” 。
    • 在“添加客户端库”对话框中,对于“提供程序”,选择“unpkg”。
    • 对于“库”,输入 @microsoft/signalr@latest。
    • 选择“选择特定文件”,展开“dist/browser”文件夹,然后选择“signalr.js”和“signalr.min.js”。
    • 将“目标位置”设置为 wwwroot/js/signalr/,然后选择“安装”。
      在这里插入图片描述

    ### 3.创建 SignalR 中心。
    中心是一个类,用作处理客户端 - 服务器通信的高级管道。

    • 在 SignalRChat 项目文件夹中,创建 Hubs 文件夹。
    • 在 Hubs 文件夹中,使用以下代码创建 ChatHub.cs 文件 :
    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRChat.Hubs
    {
        public class ChatHub : Hub
        {
            public async Task SendMessage(string user, string message)
            {
                await Clients.All.SendAsync("ReceiveMessage", user, message);
            }
        }
    }
    

    ChatHub 类继承自 SignalR Hub 类。 Hub 类管理连接、组和消息。

    可通过已连接客户端调用 SendMessage,以向所有客户端发送消息。 本教程后面部分将显示调用该方法的 JavaScript 客户端代码。 SignalR 代码是异步模式,可提供最大的可伸缩性。

    4.配置项目以使用 SignalR。

    必须将 SignalR 服务器配置为将 SignalR 请求传递给 SignalR。

    • 将以下突出显示的代码添加到 Startup.cs 文件。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.HttpsPolicy;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using SignalRChat.Hubs;
    
    namespace SignalRChat
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddRazorPages();
                services.AddSignalR();
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Error");
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapRazorPages();
                    endpoints.MapHub<ChatHub>("/chathub");
                });
            }
        }
    }
    

    这些更改将 SignalR 添加到 ASP.NET Core 依赖关系注入和路由系统。

    5.添加 SignalR 客户端代码

    • 使用以下代码替换 Pages\Index.cshtml 中的内容:
    @page
        <div class="container">
            <div class="row">&nbsp;</div>
            <div class="row">
                <div class="col-2">User</div>
                <div class="col-4"><input type="text" id="userInput" /></div>
            </div>
            <div class="row">
                <div class="col-2">Message</div>
                <div class="col-4"><input type="text" id="messageInput" /></div>
            </div>
            <div class="row">&nbsp;</div>
            <div class="row">
                <div class="col-6">
                    <input type="button" id="sendButton" value="Send Message" />
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-12">
                <hr />
            </div>
        </div>
        <div class="row">
            <div class="col-6">
                <ul id="messagesList"></ul>
            </div>
        </div>
    <script src="~/js/signalr/dist/browser/signalr.js"></script>
    <script src="~/js/chat.js"></script>
    

    前面的代码:

    • 创建名称以及消息文本的文本框和“提交”按钮。

    • 使用 id=“messagesList” 创建一个列表,用于显示从 SignalR 中心接收的消息。

    • 包含对 SignalR 的脚本引用以及在下一步中创建的“chat.js”应用程序代码。

    • 在 wwwroot/js 文件夹中,使用以下代码创建 chat.js 文件 :

    "use strict";
    
    var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
    
    //Disable send button until connection is established
    document.getElementById("sendButton").disabled = true;
    
    connection.on("ReceiveMessage", function (user, message) {
        var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
        var encodedMsg = user + " says " + msg;
        var li = document.createElement("li");
        li.textContent = encodedMsg;
        document.getElementById("messagesList").appendChild(li);
    });
    
    connection.start().then(function () {
        document.getElementById("sendButton").disabled = false;
    }).catch(function (err) {
        return console.error(err.toString());
    });
    
    document.getElementById("sendButton").addEventListener("click", function (event) {
        var user = document.getElementById("userInput").value;
        var message = document.getElementById("messageInput").value;
        connection.invoke("SendMessage", user, message).catch(function (err) {
            return console.error(err.toString());
        });
        event.preventDefault();
    });
    

    前面的代码:

    • 创建并启动连接。
    • 向“提交”按钮添加一个用于向中心发送消息的处理程序。
    • 向连接对象添加一个用于从中心接收消息并将其添加到列表的处理程序。

    6.运行应用

    • 按 Ctrl+F5 可运行应用而不进行调试。
    • 从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。
    • 选择任一浏览器,输入名称和消息,然后选择“发送消息”按钮。
    • 两个页面上立即显示名称和消息。
      在这里插入图片描述
    展开全文
  • 史上最全面的SignalR系列教程-1、认识SignalR SignalR 是什么? SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程。 实时 web 功能是让服务器代码将内容推送到连接...

    SignalR 是什么?

    SignalR 是一个面向 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程。 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力。

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话。 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换;它将继续,直到明确关闭。 对话通过永久连接进行,允许客户端向服务器发送多个消息,并允许服务器做出相应答复,值得注意的是,还允许服务器向客户端发送异步消息。是一个完全基于客户及服务器端解决方案,它是以JS作为客户端和ASP.NET作为服务端来创建这类的应用。

    传统HTTP采用的是大家熟知的“拉模式”,即客户端发出的每次请求,服务端都是被动处理。此场景下客户端是老大,很显然只有一方主动,操作与处理起来就没那么完美。为了能让服务端也能主动,html5的出现让这种变得可能,大家知道html5中有两种主动模式。第一种叫做websockect,WebSockets是Html5提供的新的API,可以在Web网页与服务器端间建立Socket连接,它是基于tcp模式的双工通讯。还有一种叫做SSE,也就是客户端来订阅服务器的一种事件模型。在html5出来之前,如果要做到服务器主动,我们只能采用变相的longpool和iframe流勉强实现。这就相当于要实现服务端的主动就有了4种方案。SignalR的出现是我们每位开发者的福音。它对上面四种方案进行了高度的封装,也就是说signalR会在这四种技术中根据浏览器和服务器设置采取最优的一种模式。

    Web消息交互技术

    对于.NET开发者的福音,.NET平台为我们提供了一种简洁高效智能的实时信息交互技术->SignalR,它集成了上述数种技术,并能根据配置自动或手动选择其最佳应用。

    服务器主动4种模式

    可以用SignalR做什么?

    • SignalR可用于将任何类型的"实时"web 功能添加到 ASP.NET 应用程序。 比如最常用的即时消息、聊天。 只要用户刷新 web 页面以查看新数据或页面实现长轮询若要检索新数据,可以考虑对它使用 SignalR。 包括仪表板和监视应用程序,协作应用程序 (如同时进行编辑的文档),作业的进度更新到并实时窗体。

    • SignalR还可以用于需要高频率从服务器中更新的全新类型weB应用程序,例如在线聊天、实时游戏、天气、股票信息更新等实时应用程序。

    • SignalR 提供一个简单的 API,用于创建从服务器端.NET 代码中调用 JavaScript 函数在客户端浏览器 (和其他客户端平台) 的服务器到客户端的远程过程调用 (RPC)。 SignalR 还包括连接管理的 API (例如,连接和断开连接事件),并对连接进行分组。

    SignalR通讯示例图

    • SignalR自动处理连接管理,并允许您同时将消息广播到所有连接的客户端,如聊天室。 还可以将消息发送到特定的客户端。 客户端和服务器之间的连接是持久性的。

    • SignalR与常用的Web浏览器上请求-响应模式不同,它支持"服务器推送"功能,可以调用远程过程调用 (RPC)。

    • SignalR应用程序可以横向扩展到数千个客户端使用服务总线、 SQL Server 或Redis。

    最重要的是SignalR 是开放源代码,有兴趣的朋友可以研究SignalR

    SignalR 和 WebSocket

    前面对SignalR已经有了一个非常全面而清晰的认识,对于SignalR 和 WebSocket关系,我们需要看下什么是WebSocket?

    WebSocket是HTML5提供的一种在单个 TCP 连接上进行全双工通讯的协议,目前chrome、Firefox、Opera、Safari等主流版本均支持,Internet Explorer从10开始支持。另外因为WebSocket 提供浏览器一个原生的 socket实现,所以直接解決了 Comet 架构很容易出错的问题,而在整個架构的复杂度上也比传统的实现简单得多。

    WebSocket本质上是一个基于TCP的持久化协议,相对于HTTP这种非持久的协议来说,它能够更好的节省服务器资源和带宽,并且真正实现实时通信。其优点在前面我们已经做了对比,最大的缺点就是对旧版本浏览器不支持。至此SignalR的出现,完美的解决了种浏览器的问题,SignalR不仅可以实现WebSocket的所有功能,还对旧版本浏览器做了支持。SignalR可自动或手动选择使用WebSocket传输还是其他替代方式传输,以实现实时Web技术。

    SignalR简化了构建实时应用的过程,它包括了一个Asp .Net服务器端库和一个Js端库,集成了数种常见的消息传输方式,如long polling,WebSocket,并提供相应的Api供开发人员选择如何调用,帮助其可以简单快速地实现客户端与服务器端相互间的实时通信。

    当环境条件合适时,SignalR将WebSocket作为底层传输方式的优先实现,当然,它也能很高效地回退到其他技术。同时,SignalR提供了非常良好的Api以供远程调用(RPC) 浏览器中的js代码。

    当WebSockets可用时(即浏览器支持Html5)SignalR使用WebSockets,当浏览器不支持时WebSockets时,SignalR将使用其它技术来保证达到相同效果。
    浏览器和客户端之间想要进行WebSocket通信的话,从一开始的握手阶段,就要从HTTP协议升级为WebSocket协议,这是服务器根据WebSocket发送的请求包决定的。

    参考文章


    一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。

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

    RDIFramework.NET官方博客:http://blog.rdiframework.net/

    同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!

    RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!

    欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。

    扫描二维码立即关注

    微信号:guosisoft

    posted on 2019-08-08 15:53 .NET快速开发框架 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/huyong/p/11321658.html

    展开全文
  • 在 Asp.NET MVC 中使用 SignalR 实现推送功能

    万次阅读 多人点赞 2012-11-09 16:32:42
    在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架。它...

    在 Asp.NET MVC 中使用 SignalR 实现推送功能

    罗朝辉 ( http://blog.csdn.net/kesalin )

    CC许可,转载请注明出处

    一,简介

    Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架。它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息。

    可访问其官方网站:https://github.com/SignalR/ 获取更多资讯。


    二,实现机制

    SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现。在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是实现了长时间的 Javascript 轮询(类似于 Comet),Hub 是用来解决实时信息交换问题,它是利用 Javascript 动态载入执行方法实现的。SignalR 将整个连接,信息交换过程封装得非常漂亮,客户端与服务器端全部使用 JSON 来交换数据。

     

    下面就 Hubs 接口的使用来讲讲整个流程:

    1,在服务器端定义对应的 hub class;

    2,在客户端定义 hub class 所对应的 proxy 类;

    3,在客户端与服务器端建立连接(connection);

    4,然后客户端就可以调用 proxy 对象的方法来调用服务器端的方法,也就是发送 request 给服务器端;

    5,服务器端接收到 request 之后,可以针对某个/组客户端或所有客户端(广播)发送消息。

     

    三,Hub 示例教程

    1,工具准备

    SignalR 运行在 .NET 4.5 平台上,所以需要安装 .NET 4.5。为了方便演示,本示例使用 ASP.NET MVC 在 Win 7 系统来实现。这需要安装 ASP.NET MVC 3 或 ASP.NET MVC 4

     

    2,建立工程

    打开 VS2010/VS2012 新建名为 SignalRTutorial 的 ASP.NET MVC 3 Web Application 工程,选择 Internet Application 模板, Razor 视图引擎以及勾选 Use HTMl 5 标签。


     

    3,安装 SignalR

    打开 NuGet 的 package manager console(Tools->Library package manager),输入:install-package SignalR.Sample,回车安装。如图所示:


    4,实现 Hub 服务器端代码

    向工程中新建 SignalR 目录,在其中添加 ChatHub.cs 文件,内容如下:

    namespace SignalTutorial.SignalR
    {
        [HubName("chat")]
        public class Chat : Hub
        {
            public void Send(string clientName, string message)
            {
                //var toSelfinfo = "You had sent message " + message;
                //Caller.addSomeMessage(clientName, toSelfinfo);
    
                // Call the addMessage method on all clients
                Clients.addSomeMessage(clientName, message);
                //Clients[Context.ConnectionId].addSomeMessage(clientName, data);
            }
        }
    }

    在上面的代码中:

    1),HubName 这个特性是为了让客户端知道如何建立与服务器端对应服务的代理对象,如果没有设定该属性,则以服务器端的服务类名字作为 HubName 的缺省值;

    2),Chat 继承自 Hub,从下面 Hub 的接口图可以看出:Hub 支持向发起请求者(Caller),所有客户端(Clients),特定组(Group) 推送消息。


    3),public void Send(string clientName, string message) 这个接口是被客户端通过代理对象调用的;

    4),Clients 是 Hub 的属性,表示所有链接的客户端页面,它和 Caller 一样是 dynamic,因为要直接对应到 Javascript 对象;

    5),Clients.addSomeMessage(clientName, message); 表示服务器端调用客户端的 addSomeMessage 方法,这是一个 Javascript 方法,从而给客户端推送消息。

    6),总结:这里实现的服务很简单,就是当一个客户端调用 Send 方法向服务器发送 message 后,服务器端负责将该 message 广播给所有的客户端(也可以给特定组或特定客户端,见屏蔽代码),以实现聊天室的功能。

     

    5,实现 Hub 客户端代码

    1),引用 SignalR Javascript

    为了简化引用 SignalR 脚本操作,我直接在 View/Shared/_Layout.cshtml 中引入 SignalR 及其他脚本:

    <head>
            <meta charset="utf-8" />
            <title>@ViewBag.Title</title>
            <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
            <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/jquery-1.6.4.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/jquery-ui-1.8.24.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/jquery.signalR-0.5.3.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>
        </head>

    注意:signalR 依赖于 jquery,所以 signalR 必须放在 jquery 之后,而 hubs 又必须放在 signalR 之后。

    然后在 body 部分加入 HubChat Tab:

    <li>@Html.ActionLink("HubChat", "HubChat", "Home")</li>

     

    2),生成访问页面

    在 HomeController 中添加如下方法:

    public ActionResult HubChat()
    {
        ViewBag.ClientName = "用户-" + Rnd.Next(10000, 99999);
        return View();
    }

    这里由服务器根据随机数来设定客户端的名字,不够严谨,因为随机数生成的名字不是唯一的的,在这里仅为简化演示,实际应用中应该使用 GUID 。

    然后生成对应的 View:HubChat.cshtml

    @model dynamic
    
    @{
        ViewBag.Title = "title";
    }
    
    <script src="@Url.Content("~/Scripts/hubDemo.js")" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
        });
    </script>
    
    <h2>Hub Chat</h2>
    
    <div>
        <input type="text" id="Placeholder" value="@ViewBag.ClientName" hidden="true"/>
        <input type="text" id="msg" />
        <input type="button" id="broadcast" value="广播" />
        
        <br />
        <br />
    
        <h3>
            消息记录: (你是:<span id="MyClientName">@ViewBag.ClientName</span>):
        </h3>
    
        <ul id="messages">
        </ul>
    </div>

    在上面的页面代码中,我添加了名为 hubDemo.js 的脚本,这将在下面介绍;此外还有一个id 为 Placeholder 的隐藏 input 控件,这是为了向 Javascript 中传递客户端的名字。

     

    3),编写 Javascript

    向 Scripts 目录添加新的 Javescript 脚本:hubDemo.js。其内容如下:

    $(function () {
    
        var myClientName = $('#Placeholder').val();
    
        // Proxy created on the fly
        var chat = $.connection.chat;
    
        // Declare a function on the chat hub so the server can invoke it
        chat.addSomeMessage = function (clientName, message) {
            writeEvent('<b>' + clientName + '</b> 对大家说: ' + message, 'event-message');
        };
    
        $("#broadcast").click(function () {
            // Call the chat method on the server
            chat.send(myClientName, $('#msg').val())
                                .done(function () {
                                    console.log('Sent message success!');
                                })
                                .fail(function (e) {
                                    console.warn(e);
                                });
        });
    
        // Start the connection
        $.connection.hub.start();
    
        //A function to write events to the page
        function writeEvent(eventLog, logClass) {
            var now = new Date();
            var nowStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
            $('#messages').prepend('<li class="' + logClass + '"><b>' + nowStr + '</b> ' + eventLog + '.</li>');
        }
    });

    上面代码有详细的注释,下面再讲讲关键之处:

    1,首先获取客户端页面的名字;

    2,然后通过 $.connection.chat 建立对应服务器端 Hub 类的代理对象 chat;

    3,定义客户端的 Javascript 方法 addSomeMessage ,服务器通过 dynamic 方式调用客户端的该方法以实现推送功能。在这里每当收到服务器推送来的消息,就在客户端页面的 messages 列表表头插入该消息。

    4,当点击广播按钮时,客户端通过代理对象调用服务器端的 send 方法以实现向服务器发送消息。

    5,通过 $.connection.hub.start(); 语句打开链接。

     

    6),编译运行 Hub 示例

    在多个浏览器窗口打开页面,效果如下:


     

    四,Persistent Connection 示例教程

    1,实现服务器端代码

    1),编写服务器 PersistentConnection 代码

    向工程中 SignalR 目录中添加 PersistentConnection.cs 文件,内容如下:

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using SignalR;
    
    namespace SignalTutorial.SignalR
    {
        public class MyConnection : PersistentConnection
        {
            protected override Task OnConnectedAsync(IRequest request, string connectionId)
            {
                return Connection.Broadcast("Connection " + connectionId + " connected");
            }
    
            protected override Task OnReconnectedAsync(IRequest request, IEnumerable<string> groups, string clientId)
            {
                return Connection.Broadcast("Client " + clientId + " re-connected");
            }
    
            protected override Task OnReceivedAsync(IRequest request, string connectionId, string data)
            {
                var info = data + ". ConnectionId is [" + connectionId + "]";
                // return Connection.Send(connectionId, info);   
    
                // Broadcast data to all clients
                return Connection.Broadcast(info);   
            }
    
            protected override Task OnDisconnectAsync(string connectionId)
            {
                return Connection.Broadcast("Connection " + connectionId + " disconncted");
            }
    
            protected override Task OnErrorAsync(Exception error)
            {
                return Connection.Broadcast("Error ocurred " + error);
            }
        }
    }

    在上面的代码中:

    1,MyConnection 继承自 PersistentConnection,这样我们就能在客户端连接,重连接,断开连接,发送消息以及连接出错的情况下进行相关的处理。从下面的 PersistentConnection 接口中可以看到,PersistentConnection 同样支持组进行推送。


    2,推送消息由 PersistentConnection 的属性 Connection 来提供,它继承自 IConnection 接口,该接口提供两个函数来实现对特定客户端的推送和广播功能。

    System.Threading.Tasks.Task Send(string signal, object value)
    System.Threading.Tasks.Task Broadcast(object value)

     

    2),配置访问路由

    为了支持客户端访问,需要在路由表中进行配置。打开 Global.asax.cs ,修改 Application_Start() 函数如下:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    
        // Make connections wait 50s maximum for any response. After
        // 50s are up, trigger a timeout command and make the client reconnect.
        GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(50);
        //DisconnectTimeout 
        //HeartBeatInterval 
        //KeepAlive 
    }

     

    在上面的代码中,我将 echo 及其子路径的访问映射到 MyConnection 上,并设置连接超时时间为 50 s。在这里还可以设置其他的一些参数,如断连超时时间,心跳间隔等。

     

    2,实现客户端代码

    1),生成访问页面

    在前面三 Hub 示例教程的基础上,我们向该工程加入使用 Persistent Connection 的演示。和前面一样,向 _Layout.cshtml 中加入 PersistentChat Tab:

    <li>@Html.ActionLink("PersistentChat", "PersistentChat", "Home")</li>

    然后在 HomeController 中添加如下方法:

    public ActionResult PersistentChat()
    {
        ViewBag.ClientName = "用户-" + Rnd.Next(10000, 99999);
        return View();
    }

    这里由服务器根据随机数来设定客户端的名字,不够严谨,因为随机数生成的名字不是唯一的的,在这里仅为简化演示,实际应用中应该使用 GUID 。

    然后生成对应的 页面: PersistentChat.cshtml:

    @model dynamic
    
    @{
        ViewBag.Title = "title";
    }
    
    <script src="@Url.Content("~/Scripts/persistent.js")" type="text/javascript"></script>
    
    <h2>Persistent Chat</h2>
    
    <div>
        <input type="text" id="Placeholder" value="@ViewBag.ClientName" hidden="true"/>
        <input type="text" id="msg" />
        <input type="button" id="broadcast" value="广播" />
    
        <br />
        <br />
        
        <h3>
            消息记录: (你是:<span id="MyClientName">@ViewBag.ClientName</span>):
        </h3>
    
        <ul id="messages">
        </ul>
    
    </div>

    在上面的页面代码中,我添加了名为 persistent.js 的脚本,这将在下面介绍;此外还有一个id 为 Placeholder 的隐藏 input 控件,这是为了向 Javascript 中传递客户端的名字。

     

    2),编写 Javascript

    向 Scripts 目录添加新的 Javescript 脚本:persistent.js。其内容如下:

    $(function () {
    
        var myClientName = $('#Placeholder').val();
    
        var connection = $.connection('/echo');
    
        connection.received(function (data) {
            var msg = new String(data);
            var index = msg.indexOf("#");
            var clientName = msg.substring(0, index);
            var content = msg.substring(index + 1);
    
            if (clientName == null || clientName == "") {
                writeEvent('<b>' + "系统消息" + '</b>: ' + content, 'event-message');
            }
            else {
                writeEvent('<b>' + clientName + '</b> 对大家说: ' + content, 'event-message');
            }
        });
    
        connection.start();
    
        $("#broadcast").click(function () {
            var msg = myClientName + "#" + $('#msg').val();
            connection.send(msg);
        });
    
        //A function to write events to the page
        function writeEvent(eventLog, logClass) {
            var now = new Date();
            var nowStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
            $('#messages').prepend('<li class="' + logClass + '"><b>' + nowStr + '</b> ' + eventLog + '.</li>');
        }
    });

    上面的代码基本与前面的 Hub 实现相同,在此就不再一一讲述。有两点值得说明:

    1,创建连接时,指定路径为 "/echo",该路径在服务器端的路由映射表被映射为 MyConnection,因而这个连接就被指向前面提供的 MyConnection。

    2,将 clientName 信息放入 message 中,并用 # 将 clientName 和消息内容连接成一个 msg。

    3,编译运行 Persistent 示例


     

    五,引用

    SignalR:

    https://github.com/SignalR/

    利用SignalR實現遠端程式遙控功能:

    http://blog.darkthread.net/post-2012-07-10-signalr-remote-controller.aspx

    一个很酷的同步操作表格的示例(使用 jTable ):

    http://www.codeproject.com/Articles/315938/Real-time-Asynchronous-Web-Pages-using-jTable-Sign

    组通知示例:

    http://www.codeproject.com/Articles/404662/SignalR-Group-Notifications



    展开全文
  • 史上最全面的SignalR系列教程-1、认识SignalR 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式 我们对SignalR的...
  • 史上最全面的SignalR系列教程-1、认识SignalR 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式 史上最全面的...
  • 目录 介绍 创建服务器 创建JavaScript客户端 服务器广播功能 创建StockTicker和StockTickerHub类 ...请注意,本文主要源自Tom Dykstra和Tom FitzMacken撰写的文章教程:使用SignalR 2实现服务广播 。 ...
  • SignalR ——Android实践

    千次阅读 2019-04-16 23:00:25
    SignalR 的版本:aspnetcore-2.2, Java SignalR-1.0.0 一、先说几个点 1、我使用SignalR的时候服务器使用的是自签名的HTTPS证书,所以OkHttp是无法直接解析的,会报错。需要修改SignalR里面OkHttp部分的源码,让其...
  • 什么是SignalR?关于SignalR介绍

    千次阅读 2012-08-15 15:14:15
    SignalR在ASP.NET MVC 4.5中出现了,ASP.NET MVC开始支持SignalR。那么什么是SignalR?有什么用途? 1.什么是SignalRSignalR是一个基于ASP.NET平台构建,利用JavaScript或者WebSockets,实现在客户端和服务端...
  • SignalR初探

    千次阅读 2019-04-16 21:30:09
    一.认识SingalR ...可以使用ajax或者原生websocket开发,但是难度...2.SignalR集线器类(SignalR持久连接)是底层机制。 3.可以实现即时通讯。SignalR有三种传输模式:LongLooping(长轮询)、WebSocket(HTML5的WEB套...
  • SignalR框架

    千次阅读 2018-07-19 17:53:07
    SignalR介绍 Http 协议是浏览器端主动发起请求,服务器不能主动发起请求。有一些场景下需要服务器主动通知浏览器端,比如网站即时消息、审核通知、系统报警。可以使用Ajax 长连接来解决,但是对于Web 服务器的压力...
  • SignalR 2 入门

    2019-01-02 18:07:25
    SignalR 版本 2 概述 本教程介绍了通过演示如何生成简单的基于浏览器的聊天应用程序的 SignalR 开发。 将 SignalR 库添加到空的 ASP.NET web 应用程序,创建一个中心类,用于将消息发送到客户端,并创建使用户能够...
  • SignalR触发OnDisconnected事件收集

    千次阅读 2014-01-25 11:03:28
    SignalR触发OnDisconnected事件收集 1.打开浏览器,第一次载入页面,先调OnDisconnected,再调OnConnected 2.离开页面,如关闭选项卡,关闭浏览器,打开其它网址 3.打开页面后,未进行任何操作,5分钟后调用一次 ...
  • SignalR推送消息到android客户端

    千次阅读 2016-08-03 16:17:00
    结合官方demo ... 整理出的SignalR服务器端 1.新建项目SignalRChat(Asp.net web Application) 2.选择 Empty 模板 3.安装 SignalR 打开V
  • Signalr如何在服务器端主动发送消息到客户端 情景:譬如一些系统消息的通知,会在服务端主动发送消息到客户端, 第一步:先确定要在哪一个Hub发; 第二步:取得该Hub的上下文,就可以调用相应的方法了
  • 在上一篇 SignalR新手系列教程详解(三)- SignalR传输方式判断和配置讲解了怎样判断SignalR传输方式和怎么去配置SignalR传输方式。今天我们讲解一下SignalR 的连接和Hub。 SignalR 连接和Hub Signal...
  • 最近在测试的时候发现,用SignalR做的实时消息推送程序,部署在IIS上之后间隔一定时间(大概间隔在25-28小时之间)就会断开连接。因为做了异常捕获,但是每次断开的那个时间点都没有异常日志,所以猜测可能不是程序...
  • 软件:VS2015/MSSQL2014 问题:为什么下图的前端显示内容 传表就可以 而像我传num的一个数就不行了??![图片说明](https://img-ask.csdn.net/upload/201605/02/1462163688_635266.png)![图片说明]...
  • 注:Asp.Net SignalR 的客户端和 Asp.Net Core 的版本不同,目前不能通用。 二、当前版本的客户端,没有自动重新连接功能,需要自己处理重新连接。 在3.0之前,SignalR的JavaScript客户端不会自动重新连接。...
1 2 3 4 5 ... 20
收藏数 5,089
精华内容 2,035
关键字:

signalr