SignalR学习

SignalR是一个.NET Core/.NET Framework的开源实时框架

SignalR可使用Web Socket,Server Sent Events 和 Long Polling作为底层传输方式

SignalR这个框架分服务器端和客户端,服务器端支持ASP.NET Core 和ASP.NET;而客户端除了支持浏览器里的javascript以外,也支持其他类型的客户端,例如桌面应用。

回落机制

Web Socket是最好的最有效的传输方式,如果浏览器或Web服务器不支持它的话,将会降级使用SSE,实在不行就用Long Polling

一旦建立连接,SignalR就会开始发送Keep alive 消息,来检查连接是否还正常。如果有问题,就会抛出异常。

SignalR默认采用回落机制来进行传输和连接。也可以禁用回落机制,只采用其中一种传输方式

RPC

RPC(Remote Procedure Call) 它的优点就是可以像调用本地方法一样调用远程服务

SignalR才用RPC方式来进行客户端与服务端之间的通信

SignalR利用底层传输来让服务器可以调用客户端的方法,反之亦然,这些方法可以带参数,参数可以是复杂对象,SignalR负责序列化和反序列化

Hub

Hub是SignalR的一个组件,运行在ASP.NET Core应用里,它是服务器的一个类

Hub使用RPC接收从客户端发来的消息,也能把消息发送给客户端。它就是一个通信用的Hub

SignalR在ASP.NET Core里面的应用:学习连接  https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio

创建 SignalR 中心

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

  • 在 SignalRChat 项目文件夹中,创建 Hubs 文件夹 。
  • 在 Hubs 文件夹中,使用以下代码创建 ChatHub.cs 文件 :
    using Microsoft.AspNetCore.SignalR;
    using System.Threading.Tasks;
    
    namespace SignalRChat.Hubs
    {
         public class ChatHub : Hub
        {
            /// <summary>
            /// 客户端连接
            /// </summary>
            /// <returns></returns>
            public override async Task OnConnectedAsync()
            {
                await base.OnConnectedAsync();
            }
            /// <summary>
            /// 取消连接
            /// </summary>
            /// <param name="exception"></param>
            /// <returns></returns>
            public override async Task OnDisconnectedAsync(Exception exception)
            {
                await base.OnDisconnectedAsync(exception);
            }
    
            /// <summary>
            /// 用户登陆客户端
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public async Task UserLogin(string id)
            {
                //UserInfo userInfo = new UserInfo()
                //{
                //    ConnectionId = Context.ConnectionId,
                //    Id = id
                //};
                //UserDataManager.User.Add(userInfo);
                await Clients.Caller.SendAsync("AnyOne", id + "连接成功");
    
            }
        }
    }
    

      

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

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

配置 SignalR

必须配置 SignalR 服务器,以将 SignalR 请求传递到 SignalR。

  • 将以下突出显示的代码添加到 Startup.cs 文件 。
 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.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddSignalR();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment 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.UseCookiePolicy();

            app.UseSignalR(routes =>
            {
                routes.MapHub<ChatHub>("/chatHub");
            });

            app.UseMvc();
        }
    }

这些更改将 SignalR 添加到 ASP.NET Core 依赖关系注入系统和中间件管道。

Controller消息发送

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using SignalRTestCore.SignalR;

namespace SignalRTestCore.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class PushController : ControllerBase
    {
        private IHubContext<ChatHub> _hubContext;

        public PushController(IHubContext<ChatHub> hubContext)
        {
            _hubContext = hubContext;
        }

        [HttpPost]
        public async Task AnyOne(string message)
        {
            await _hubContext.Clients.All.SendAsync("AnyOne", message);
        }

    }
}

  

客户端代码(项目使用的是Vue框架) 学习连接 https://www.npmjs.com/package/@aspnet/signalr

安装signalR插件  npm install @aspnet/signalr

const signalR = require(‘@aspnet/signalr‘)

let path = "https://www.xxx.com/api";
let token ="Bearer ....";
let id="f30675f6-f488-4e41-8f47-6b50a1beccca";

const connection = new signalR.HubConnectionBuilder()
  .withUrl(path + ‘/signalr/chathub‘, {
    accessTokenFactory: () => String(token).replace("Bearer ", "")
  })
  .build()

//连接
connection.start().then(() => {
      connection.invoke(‘UserLogin‘, id).then(() => {

      });
});      

//接收消息
connection.on(‘AnyOne‘, data => {
  console.log("AnyOne", data);
})

  

原文地址:https://www.cnblogs.com/zengxia/p/11139237.html

时间: 2024-11-13 03:39:12

SignalR学习的相关文章

C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何去推送复杂的数据,以及推送一个实时的图表数据,文本为我原创,转载请注明出处:Richard.Hu,先上一堆乱七八糟的说明先: SignalR的官方地址是: https://www.asp.net/signalr 网上给出例子是一个聊天的例子,官网地址是:https://docs.microsoft.

【SignalR学习系列】2. 第一个SignalR程序

新建项目 1.使用VisualStudio 2015 新建一个Web项目 2.选择空模板 3.添加一个新的SignalR Hub Class (v2)类文件,并修改类名为ChatHub 4.修改ChatHub代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; namespace SignalRDemo { pu

【SignalR学习系列】3. SignalR实时高刷新率程序

创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 创建基础应用 添加一个 SignalR Hub 类,并命名为 MoveShapeHub ,更新代码. using Microsoft.AspNet.SignalR; using Newtonsoft.Json; namespace SignalRDemo3 { public class MoveShape

【SignalR学习系列】4. SignalR广播程序

创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端代码 创建 Stock 类 using System; namespace SignalRDemo4 { public class Stock { private decimal _price; public string Symbol { get; set; } public decimal Pr

SignalR 学习记录-简介

SignalR 简介 什么是 SignalR? ASP.NET SignalR 是 ASP.NET 开发人员的库,可简化将实时 web 功能添加到应用程序的过程. 实时 web 功能使服务器代码能够在可用时立即将内容推送到连接的客户端,而不是让服务器等待客户端请求新的数据. SignalR 可用于将任何种类的 "实时" web 功能添加到 ASP.NET 应用程序. 尽管聊天通常用作示例,但你可以执行更多操作. 用户每次刷新网页以查看新数据,或者页面实现长轮询来检索新数据时,都是使用

快速了解SignalR—在MVA微软虚拟学院学习SignalR

©版权声明:本文为博主原创文章,如需转载请注明出处. SignalR把实时Web功能变得异常简单. 如果您希望在几个小时内对SignalR有一个直观的了解,观看微软虚拟学院(MVA)的视频教学Lighting Up Real-Time Web Communications with SignalR或许是个不错的选择. 这是一个大概四个小时的视频教学,分为五个部分.除了视频,还配有PPT和小测验.视频是英文的,配有英文字幕.通过这几个小时的学习,您将对SignalR的功能以及如何使用有一个初步的了

一步一步学习SignalR进行实时通信_8_案例2

原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建立DrawingHub 页面 javascript 实现效果 结束语 参考文献 前言 这讲分析一个案例,在一个画板上画画实时在其他客户端上显示. 配置Hub 在Startup中进行配置: public void Configuration(IAppBuilder app) { app.MapSign

一步一步学习SignalR进行实时通信_5_Hub

原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 Hub封装好的常用方法 Hub常用方法解释 保持状态 前后台交互 结束语 参考文献 前言 上一讲,我们简单的介绍了下Hub的配置以及实现方法,这一将我希望把更多的细节梳理清楚,不至于让大家在细节上面摸不着头脑,理解深了,那么做项目自然就会相对轻松一些. Hub命名规则 Hub与Persistent

一步一步学习SignalR进行实时通信_3_通过CORS解决跨域

原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 前言 关于start()的补充 跨域解决方案 JSONP CORS CORS跨域演示 结束语 参考文献 前言 这周工作比较忙,一直没有时间学习SignalR,大致希望一周能写一篇关于SignalR的文章.上一篇用Persistent Connections方式实现了个简单的在线