初识signalr(代码片段)

mosakashaka mosakashaka     2023-04-06     290

关键词:

SIgnalR是微软开发的一套通信组件,如果听说过websocket的话,那么SignalR功能和websocket类似,提供客户端和服务端的实时通信。

SignalR客户端可用于.net平台和js上,服务端(afaik)是在.net上的。

对于js和服务器间的通信,signalR相较于websocket的主要好处在于兼容性,websocket是H5的特性,对于老式浏览器不支持,SignalR会自动退回长连接等方式,保证跨浏览器支持。

简单记录一下SignalR的客户端和服务端,都以c#为例。

服务端

准备工作

引入SignalR的程序包,可在NuGet中找到

配置初始化

这里使用的是官网上给出的通过Owin来配置的方式。

需要创造一个StartUp类,对SignalR进行注册。

[assembly: OwinStartup(typeof(RS2_Test_Hub.Startup))]

namespace RS2_Test_Hub

public class Startup

public void Configuration(IAppBuilder app)

var hubConfiguration = new Microsoft.AspNet.SignalR.HubConfiguration();
//这里第一个参数是提供SignalR的路径,默认是/signalR,这里我改为了根路径
app.MapSignalR("", hubConfiguration);


提供SignalR服务

SignalR显然需要网路来连接,所以需要一个Web服务去承载他。

一开始我在测试的时候,配置好了SignalR服务端,但客户端怎么也连不上。

检查以后,发现仅仅配置注册,本机并没有开端口监听

后来搜索半天,才明白需要额外的web服务作为载体才能提供出来。

其实我在配置的时候,也好奇哪里有配置端口的地方。。

用这种高级封装的语言,有时候会很方便,但是过多的细节封装,使人对他的实现原理了解更加困难,碰到问题时,更加难以解决

 

如果不是通过IIS等方式,可以使用SelfHost方式,启动一个C#的HttpServer来提供服务 。

这需要引入Owin的SelfHost,并在程序启动时,同时开启这个简单的Web服务

string url = "http://127.0.0.1:5570";//这里以本机测试,5570端口为例
WebApp.Start(url);

真正实现业务的服务类

服务类,这里叫做Hub,需要继承自Hub类

    [HubName("SignalR_Hub_Inventory")]
    public class MyHub : Hub
    
        public void NewContosoChatMessage(string name, string message)
        
            Clients.All.addNewMessageToPage(name, message);
        
    public IEnumerable<Stock> GetAllStocks()
    
        return _stockTicker.GetAllStocks();
    
</code></pre>
  • Hub的类名叫做MyHub,但是指定了HubName属性
    • 如果未指定,客户端需要用`myHub`名称来连接
    • 这里指定了,所以需要用特定的名称来连接
  • 这里定义了两个public方法,这两个可被客户端调用
    • 第一个方法,又调用了客户端的方法
    • 第二个方法,可以无视Stock类,这是我示例的类,这里展示的是,可以返回列表类型

客户端

配置和初始化

引入SignalR包就不必说了,初始化相关:

var hubConnection = new HubConnection("http://localhost:5700/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("SignalR_Hub_Inventory");
stockTickerHubProxy.On<Msg>("addNewMessageToPage", msg => Console.WriteLine("Name 0 Message 1", msg.name, msg.message));
await hubConnection.Start();
  • 创建连接,指定连接的服务端Hub地址
  • 指定要连接的Hub,这里连接的是上面创建的`SignalR_Hub_Inventory`
  • On方法,定义了客户端可以相应的服务端的请求
  • 最后调用Start,开始连接

调用服务端方法

在创建的hub上,通过名字指定需要调用的服务端方法即可

var stock = _hub.Invoke<IList<Stock>>("GetAllStocks", null);
  • 第二个null参数,实际是服务端需要的参数列表

断线重连

SignalR客户端在连接断开后,会自动尝试重连,但是经过一段时间如果仍然没有连上(似乎是110秒),则会断开了,如果我们想让客户端始终尝试重连,可以通过捕捉断开事件,手动触发连接。

Hub连接创建时,注册断开事件:

_hubConnection.Closed += HandleClosed;

在处理事件中重新连接:

        private void HandleClosed()
        
            _hubConnection.Start().Wait(_connectionTimeout);
        

当然,实际处理中,断开后可以通过定时器,过一段时间再去重连,毕竟刚刚断开也是因为没有连上的原因。

 

结语

SignalR设计的功能还有很多,例如分组,配置等等。

暂时用到的就是这些

 

初识signalr

先不说SignalR是什么,我们先说它可以干什么,官方的解释是:  虽然经常以聊天为例,但您可以做更多的事情。使用SignalR使您的ASP.NET应用程序栩栩如生,每当用户刷新网页以查看新数据,或者该页面实施Ajax长轮询来检索新... 查看详情

html你好signalr(代码片段)

查看详情

signalr(代码片段)

SignalRhttps://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.11.SignalR是什么ASP.NETSignalR是一个ASP.NET下的类库,可以在ASP.NET的Web项目中实现实时通信。就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当... 查看详情

signalr集线器(代码片段)

//1.启动publicclassStartuppublicvoidConfiguration(IAppBuilderapp)app.Map("/signalr",map=>//跨域map.UseCors(CorsOptions.AllowAll);//集线器varhubConfiguration=newHubConfigurationEnableJSONP=true;map.Ru 查看详情

signalr的jwtbearer认证(代码片段)

一、客户端请求SignalR时,将Token放入QueryStringvarconnection=newHubConnectionBuilder().WithUrl($"http://xxx/signalr?Bearer=Token").Build(); 二、在Startup中,在UseAuthentication之前获取Token并放入Headerapp.Use((context, 查看详情

记录ocelot+signalr多服务端测试(代码片段)

前言分两个项目,一个Gatway,一个SignalR贴代码1、Gatway1、引用Ocelot2、添加一点点代码Startup.cs3、简单配置ocelotocelot.json"ReRoutes":["DownstreamPathTemplate":"/catchAll",//下游路径"DownstreamScheme 查看详情

signalr简单封装(代码片段)

...浏览器)主动发起请求,那么,这个问题怎么解?Asp.NetSignalR是一个Asp.Net 下的类库,可以在Asp.Net 的Web项目中实现实时通信,完美解决这个问题。关于SignalR具体的介绍可以查阅其他资料,或者查看官方文档:http: 查看详情

当使用selfhost的owin承载signalr时,重启owin后,signalr不能正常工作(代码片段)

需要在初始化时,重新对Resolver赋值一个新的实例:publicclassStartuppublicvoidConfiguration(IAppBuilderapp)varhubConfiguration=newHubConfigurationResolver=newDefaultDependencyResolver();app.MapSignalR(hubConfiguration) 查看详情

记一次signalr的部署错误问题(代码片段)

前不久的工作中,需要集成signalr和vue实现一个消息推送的前端展示页面,集成倒是很顺利,nuget和npm就解决了问题,但接下来的部署上遇到了几个问题,需要记录一下:问题1:集成了redis缓存链接,在部署时未安装redis,导致sign... 查看详情

centosnginx配置支持websocket(signalr)(代码片段)

signalr默认会调用websocket去连接集线器,centos下,用nginx默认设置不支持ws的所以,必须更改配置,让nginx通过websocketserverlisten80;server_nameadmin.mu-booking.com;location/proxy_passhttp://127.0.0.1:5000;proxy_http_version1.1;proxy_set 查看详情

signalr设计理念(代码片段)

SignalR设计理念(二)实现客户端和服务器端的实时通讯.前言:客户端方法忽略大小写,主要原因基于是URL对大小写不敏感的问题,开发者之间为了更好的协同开发,定下的开发者协议。问题阐述客户端数量不确定!同一个用户的客... 查看详情

记录一次signalr服务的搭建注意事项(代码片段)

...需要给现有客户端推送信息的需求,于是就准备尝试一下SignalR,并做此记录,记录在搭建SignalR过程中遇到的问题。1.SignalRWinForm服务端搭建添加相关引用那些我就不在这里详细介绍了,就记录一些注意事项:1.1在添加Startup.cs的... 查看详情

利用signalr实施响应股票数据波动(代码片段)

1.新建ASP.NETWeb应用程序, 选择Empty模板。2.创建Stock.cs类1publicclassStock23///<summary>4///价格5///</summary>6privatedecimal_price;78///<summary>9///象征10///</summary>11publicstringSymbo 查看详情

signalr学习记录-简介(代码片段)

SignalR简介什么是SignalR?ASP.NETSignalR是ASP.NET开发人员的库,可简化将实时web功能添加到应用程序的过程。 实时web功能使服务器代码能够在可用时立即将内容推送到连接的客户端,而不是让服务器等待客户端请求新的数据。Sign... 查看详情

基于signalr的服务端和客户端通讯处理(代码片段)

SignalR是一个.NETCore/.NETFramework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于SignalR的构建一个基于Winform的服务端和客户端的通讯处理案例,介绍其中的处理... 查看详情

初识存储过程(代码)(代码片段)

--1createprocedureGetStudentsInfoasselect*fromstudentgoexecGetStudentsInfoalterprocedureGetStudentsInfoasselect*fromstudentwherestuSex=‘男‘execGetStudentsInfo--2/*publicDataTableGetStudentsInfoByGrade( 查看详情

signalr的应用(代码片段)

...r););ViewCode 三.ajax定时查询虽然简单明了,但是听说了signalr后决定试下。1.添加包,nuget搜索SignaR安装即可。2.在前端页面添加js:<!--ReferencetheSignalRlibrary.--><scriptsrc="~/Scripts/jquery.signalR-2.2.2.js"></scri 查看详情

signalr在react/go技术栈的实践(代码片段)

...哧半年,优化改进了一个运维开发web平台。本文记录SignalR在react/golang技术栈的生产小实践。01背景有个前后端分离的运维开发web平台,后端会间隔5分钟同步一次数据,现在需要将最新一次同步的时间推送到web前端。... 查看详情