asp.net core 使用 signalR(一)
asp.net core 使用 signalR(一)
Intro
SignalR 是什么?
ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码能够即时将内容推送到客户端。
SignalR 的适用对象:
- 需要来自服务器的高频率更新的应用。 例如:游戏、社交网络、投票、拍卖、地图和 GPS 应用。
- 仪表板和监视应用。 示例包括公司仪表板、销售状态即时更新或行程警示。
- 协作应用。 协作应用的示例包括白板应用和团队会议软件。
- 需要通知的应用。 社交网络、电子邮件、聊天、游戏、行程警示以及许多其他应用都使用通知。
SignalR 提供了一个用于创建服务器到客户端远程过程调用(RPC)的 API。 RPC 通过服务器端 .NET Core 代码调用客户端上的 JavaScript 函数。
以下是 ASP.NET Core SignalR 的一些功能:
自动管理连接。
同时向所有连接的客户端发送消息。 例如,聊天室。
将消息发送到特定的客户端或客户端组。
扩展以处理增加的流量。
传输
SignalR 支持几种方法用于处理实时通信:
服务器发送事件
长轮询
SignalR 会从服务器和客户端支持的功能中自动选择最佳传输方法
最近我们在做一个对战的小游戏,类似于之前比较火的答题应用,使用 websocket 来实现客户端和服务器端的通信,服务器端使用的 SignalR
SignR 基本使用
服务注册
服务配置如下:
services.AddSignalR(options =>
{
options.HandshakeTimeout = TimeSpan.FromSeconds(3);
options.KeepAliveInterval = TimeSpan.FromSeconds(10);
})
// JSON 序列化配置
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
options.PayloadSerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
options.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.PayloadSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
认证方式配置
默认的 Token 是从请求头 Authorization 中获取的,而 signalr 请求服务器端的时候是放在请求地址的 query string access-token 里面的,所以我们要配置从请求头中获取或者从 QueryString 里获取,示例配置如下:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(options =>
{
options.Authority = Configuration["Authorization:Authority"];
options.RequireHttpsMetadata = false;
options.TokenRetriever = request =>
{
var token = TokenRetrieval.FromAuthorizationHeader()(request);
if (string.IsNullOrWhiteSpace(token))
{
token = TokenRetrieval.FromQueryString()(request);
}
return token;
};
});
Configue 配置
app.UseAuthentication();
app.UseSignalR(builder =>
{
builder.MapHub<QuizGameHub>("/hubs/quizGame"); // 注册 Hub
});
app.UseMvc();
自定义 Hub
定义 Hub 契约
定义一个客户端方法的接口以实现强类型的客户端方法调用,这里客户端调用服务器端的方法也定义了一个接口来约束,示例如下:
/// <summary>
/// 客户端定义的方法
/// </summary>
public interface IQuizGameClient
{
Task GameQuestionsReceived(QuizQuestion question);
Task MatchSuccess(GameInfo gameInfo);
Task GameAnswerResultReceived(CheckedUserQuizAnswerModel answer);
Task GameOver(GameResult result);
}
/// <summary>
/// 服务器端定义的方法
/// </summary>
public interface IQuizGameServer
{
Task<ServiceResult<IReadOnlyList<QuizGameRuleInfo>>> GetGameRules();
Task AutoMatch(int ruleId);
Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId);
}
定义 Hub
有了契约之后,我们就可以定义强类型的 Hub 了,示例如下:
[Authorize(Policy = "bearer")]
public partial class QuizGameHub : Hub<IQuizGameClient>, IQuizGameServer
{
public Task<ServiceResult<IReadOnlyList<QuizGameRuleInfo>>> GetGameRules()
{
return Task.FromResult(ServiceResult.Success(QuizGameStorage.GameRuleInfos));
}
// ...
public async Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId)
{
// 调用客户端方法
await Clients.User(Context.UserIdentifier)
.GameAnswerResultReceived(checkedResult); // 向指定用户发送消息
}
public async Task AutoMatch(int ruleId)
{
// ...
}
}
Reference
- https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.2
- https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-2.2
asp.net core 使用 signalR(一)的更多相关文章
- Asp.Net Core使用SignalR进行服务间调用
网上查询过很多关于ASP.NET core使用SignalR的简单例子,但是大部分都是简易聊天功能,今天心血来潮就搞了个使用SignalR进行服务间调用的简单DEMO. 至于SignalR是什么我就不 ...
- asp.net core 使用 signalR(二)
asp.net core 使用 signalR(二) Intro 上次介绍了 asp.net core 中使用 signalR 服务端的开发,这次总结一下web前端如何接入和使用 signalR,本文 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- asp.net core 五 SignalR 负载均衡
SignalR : Web中的实时功能实现,所谓实时功能,就是所连接的客户端变的可用时,服务端能实时的推送内容到客户端,而不是被动的等待客户端的请求.Asp.net SignalR 源码 ...
- ASP.NET Core 使用 SignalR 遇到的 CORS 问题
问题 将 SignalR 集成到 ASP.NET Core MVC 程序的时候,按照官方 DEMO 配置完成,但使用 DEMO 页面建立连接一直提示如下信息. Access to XMLHttpReq ...
- 在ASP.NET Core下使用SignalR技术
一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...
- ASP.NET Core 2.0 SignalR 示例
# 一.前言 上次讲SignalR还是在<[在ASP.NET Core下使用SignalR技术](http://dotnet.ren/2017/02/21/%E5%9C%A8ASP-NET-Co ...
- 在ASP.NET CORE 2.0使用SignalR技术
一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...
- 在 ASP.NET Core 中使用 SignalR
https://weblogs.asp.net/ricardoperes/signalr-in-asp-net-core 作者:Ricardo Peres 译者:oopsguy.com 介绍 Sign ...
随机推荐
- Springmvc的运行原理 SpringMvc的优点
SpringMVC框架运行原理 1:客户端发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(url),查询一个或多个HandlerMapping, 前端控制器,来决定 ...
- web面试
什么是面向对象? 程序中的事物都是用对象结构来描述的,所有的程序都是用面向对象的思想,管理数据和功能的. 面向对象三大特点:封装 继承 多态 什么是封装? 创建一个对象结构,用来保存一个事物的属性和方 ...
- 源码解读 Spring Boot Profiles
前言 上文<一文掌握 Spring Boot Profiles> 是对 Spring Boot Profiles 的介绍和使用,因此本文将从源码角度探究 Spring Boot Profi ...
- 大数据学习之旅1——HDFS版本演化
最近开始学习大数据,发现大数据有很多很多组件,我现在负责的是HDFS(Hadoop分布式储存系统)的学习,整理了一下HDFS的版本情况.因为HDFS是Hadoop的重要组成部分,所以有关HDFS的版本 ...
- 学习Canvas这一篇文章就够了
一.canvas简介 <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是 ...
- 7.4 元组tuple类型内置方法
元组tuple 元组相当于不可变的列表,在定义完成后后面就不可以进行更改,因此元组只可取不可存 因为不可变,所以相对列表来说,他的功能也少了很多,所以,不难理解,他有个优点就是占用内存小. 作用:能够 ...
- IDEA搭建工程
1. 创建一个Project File -> New -> Project... : 选择jdk版本,然后Next: 输入项目名,确定项目路径,Finish. 2. 创建一个Modul ...
- win7 部署tomcat
1,下载 jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3-download-1501626.html 2,下载t ...
- (四十八)c#Winform自定义控件-下拉按钮
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- elk安装与搭建
Elasticsearch安装配置 ·下载elasticsearch.tar.gz包,解压压缩包.(此处为单机版es,集群请参考 https://www.cnblogs.com/lazycxy/p/9 ...