请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

asp.net core 使用 signalR

[复制链接]
查看3012 | 回复0 | 2019-9-17 11:34:02 | 显示全部楼层 |阅读模式

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 支持几种方法用于处置惩罚实时通讯:

  • WebSockets
  • 服务器发送事故
  • 长轮询

    SignalR 会从服务器和客户端支持的功能中自动选择最佳传输方法

迩来我们在做一个对战的小游戏,类似于之前比较火的答题应用,利用 websocket 来实现客户端和服务器端的通讯,服务器端利用的 SignalR

SignR 根本利用

服务注册

服务设置如下:

  1. <code>services.AddSignalR(options =>
  2. {
  3. options.HandshakeTimeout = TimeSpan.FromSeconds(3);
  4. options.KeepAliveInterval = TimeSpan.FromSeconds(10);
  5. })
  6. // JSON 序列化设置
  7. .AddJsonProtocol(options =>
  8. {
  9. options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
  10. options.PayloadSerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  11. options.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  12. options.PayloadSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
  13. });
  14. </code>
复制代码

认证方式设置

默认的 Token 是从哀求头 Authorization 中获取的,而 signalr 哀求服务器端的时候是放在哀求地址的 query string access-token 内里的,以是我们要设置从哀求头中获取大概从 QueryString 里获取,示例设置如下:

  1. <code>services.AddAuthentication(options =>
  2. {
  3. options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  4. options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  5. options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
  6. })
  7. .AddIdentityServerAuthentication(options =>
  8. {
  9. options.Authority = Configuration["Authorization:Authority"];
  10. options.RequireHttpsMetadata = false;
  11. options.TokenRetriever = request =>
  12. {
  13. var token = TokenRetrieval.FromAuthorizationHeader()(request);
  14. if (string.IsNullOrWhiteSpace(token))
  15. {
  16. token = TokenRetrieval.FromQueryString()(request);
  17. }
  18. return token;
  19. };
  20. });</code>
复制代码

Configue 设置

  1. <code>
  2. app.UseAuthentication();
  3. app.UseSignalR(builder =>
  4. {
  5. builder.MapHub<QuizGameHub>("/hubs/quizGame"); // 注册 Hub
  6. });
  7. app.UseMvc();</code>
复制代码

自界说 Hub

界说 Hub 左券

界说一个客户端方法的接口以实现强类型的客户端方法调用,这里客户端调用服务器端的方法也界说了一个接口来束缚,示比方下:

  1. <code>/// <summary>
  2. /// 客户端界说的方法
  3. /// </summary>
  4. public interface IQuizGameClient
  5. {
  6. Task GameQuestionsReceived(QuizQuestion question);
  7. Task MatchSuccess(GameInfo gameInfo);
  8. Task GameAnswerResultReceived(CheckedUserQuizAnswerModel answer);
  9. Task GameOver(GameResult result);
  10. }
  11. /// <summary>
  12. /// 服务器端界说的方法
  13. /// </summary>
  14. public interface IQuizGameServer
  15. {
  16. Task<ServiceResult<IReadOnlyList<QuizGameRuleInfo>>> GetGameRules();
  17. Task AutoMatch(int ruleId);
  18. Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId);
  19. }</code>
复制代码

界说 Hub

有了左券之后,我们就可以界说强类型的 Hub 了,示比方下:

  1. <code>[Authorize(Policy = "bearer")]
  2. public partial class QuizGameHub : Hub<IQuizGameClient>, IQuizGameServer
  3. {
  4. public Task<ServiceResult<IReadOnlyList<QuizGameRuleInfo>>> GetGameRules()
  5. {
  6. return Task.FromResult(ServiceResult.Success(QuizGameStorage.GameRuleInfos));
  7. }
  8. // ...
  9. public async Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId)
  10. {
  11. // 调用客户端方法
  12. await Clients.User(Context.UserIdentifier)
  13. .GameAnswerResultReceived(checkedResult); // 向指定用户发送消息
  14. }
  15. public async Task AutoMatch(int ruleId)
  16. {
  17. // ...
  18. }
  19. }</code>
复制代码

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






来源:https://www.cnblogs.com/weihanli/archive/2019/09/15/use-signalr-in-aspnetcore.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则