首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

具有ASP.NET核心的SignalR不使用websockets,而是使用长轮询

SignalR是一个开源的实时通信库,它可以在客户端和服务器之间建立持久性的连接,实现实时的双向通信。SignalR可以在多种平台和编程语言中使用,包括ASP.NET核心。

在默认情况下,SignalR使用WebSockets作为其传输协议,因为WebSockets提供了低延迟、高效的双向通信。然而,并非所有的环境都支持WebSockets,特别是在一些旧版本的浏览器或网络环境中。

当环境不支持WebSockets时,SignalR可以自动降级到其他传输协议,如长轮询(Long Polling)。长轮询是一种模拟实时通信的技术,它通过客户端定期向服务器发送请求,服务器在有新消息时立即响应,否则保持连接处于挂起状态,直到有新消息或超时。

长轮询虽然不如WebSockets效率高,但在不支持WebSockets的环境下仍然可以实现实时通信。它可以通过减少请求的频率和数据量来降低对服务器的压力,并且在大多数情况下仍然能够提供良好的用户体验。

对于ASP.NET核心的SignalR,如果不想使用WebSockets而是使用长轮询,可以通过配置SignalR的传输选项来实现。具体来说,可以在Startup类的ConfigureServices方法中添加以下代码:

代码语言:csharp
复制
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产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券