SignalR是一个开源的实时通信库,它可以在客户端和服务器之间建立持久性的连接,实现实时的双向通信。SignalR可以在多种平台和编程语言中使用,包括ASP.NET核心。
在默认情况下,SignalR使用WebSockets作为其传输协议,因为WebSockets提供了低延迟、高效的双向通信。然而,并非所有的环境都支持WebSockets,特别是在一些旧版本的浏览器或网络环境中。
当环境不支持WebSockets时,SignalR可以自动降级到其他传输协议,如长轮询(Long Polling)。长轮询是一种模拟实时通信的技术,它通过客户端定期向服务器发送请求,服务器在有新消息时立即响应,否则保持连接处于挂起状态,直到有新消息或超时。
长轮询虽然不如WebSockets效率高,但在不支持WebSockets的环境下仍然可以实现实时通信。它可以通过减少请求的频率和数据量来降低对服务器的压力,并且在大多数情况下仍然能够提供良好的用户体验。
对于ASP.NET核心的SignalR,如果不想使用WebSockets而是使用长轮询,可以通过配置SignalR的传输选项来实现。具体来说,可以在Startup类的ConfigureServices方法中添加以下代码:
services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.AddMessagePackProtocol()
.AddAzureSignalR()
.AddStackExchangeRedis(options =>
{
options.Configuration = "redis-connection-string";
})
.AddAzureSignalR(options =>
{
options.ConnectionString = "azure-signalr-connection-string";
})
.AddAzureSignalR(options =>
{
options.AccessTokenProvider = (request) =>
{
// 自定义访问令牌提供程序
return Task.FromResult("access-token");
};
})
.AddAzureSignalR(options =>
{
options.ClaimsProvider = (request) =>
{
// 自定义声明提供程序
return new[]
{
new Claim(ClaimTypes.NameIdentifier, "user-id"),
new Claim(ClaimTypes.Name, "user-name")
};
};
});
上述代码中,通过调用AddSignalR方法来添加SignalR服务,并通过AddJsonProtocol、AddMessagePackProtocol、AddAzureSignalR、AddStackExchangeRedis等方法配置不同的传输选项。
需要注意的是,以上代码中的示例配置了多个传输选项,包括使用JSON和MessagePack作为消息序列化协议,使用Azure SignalR和StackExchange.Redis作为后端传输,以及自定义访问令牌提供程序和声明提供程序。
关于SignalR的更多信息和详细配置,请参考腾讯云的SignalR产品文档:SignalR产品介绍。
领取专属 10元无门槛券
手把手带您无忧上云