翻译网站平台建设,域名注册要求,百度公司做网站优化多少钱,磁力在线搜索引擎asp.net core 使用 signalR#xff08;一#xff09;IntroSignalR 是什么#xff1f;ASP.NET Core SignalR 是一个开源代码库#xff0c;它简化了向应用添加实时 Web 功能的过程。实时 Web 功能使服务器端代码能够即时将内容推送到客户端。SignalR 的适用对象#xff1a;需… asp.net core 使用 signalR一IntroSignalR 是什么ASP.NET Core SignalR 是一个开源代码库它简化了向应用添加实时 Web 功能的过程。实时 Web 功能使服务器端代码能够即时将内容推送到客户端。SignalR 的适用对象需要来自服务器的高频率更新的应用。例如游戏、社交网络、投票、拍卖、地图和 GPS 应用。仪表板和监视应用。示例包括公司仪表板、销售状态即时更新或行程警示。协作应用。协作应用的示例包括白板应用和团队会议软件。需要通知的应用。社交网络、电子邮件、聊天、游戏、行程警示以及许多其他应用都使用通知。SignalR 提供了一个用于创建服务器到客户端远程过程调用RPC的 API。RPC 通过服务器端 .NET Core 代码调用客户端上的 JavaScript 函数。以下是 ASP.NET Core SignalR 的一些功能自动管理连接。同时向所有连接的客户端发送消息。例如聊天室。将消息发送到特定的客户端或客户端组。扩展以处理增加的流量。传输SignalR 支持几种方法用于处理实时通信WebSockets服务器发送事件长轮询SignalR 会从服务器和客户端支持的功能中自动选择最佳传输方法最近我们在做一个对战的小游戏类似于之前比较火的答题应用使用 websocket 来实现客户端和服务器端的通信服务器端使用的 SignalRSignR 基本使用服务注册服务配置如下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.MapHubQuizGameHub(/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
{ TaskServiceResultIReadOnlyListQuizGameRuleInfo GetGameRules(); Task AutoMatch(int ruleId); Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId);
}定义 Hub有了契约之后我们就可以定义强类型的 Hub 了示例如下:[Authorize(Policy bearer)]
public partial class QuizGameHub : HubIQuizGameClient, IQuizGameServer
{ public TaskServiceResultIReadOnlyListQuizGameRuleInfo 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) { // ... }
}Referencehttps://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?viewaspnetcore-2.2https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?viewaspnetcore-2.2