首页
学习
活动
专区
工具
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产品介绍

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

相关·内容

SignalR

SignalR是一个继承的客户端与服务器库,基于浏览器的客户端和基于ASP.NET的服务器组件可以借助它来进行双向多步对话,换句话说,该对话可不受限制的进行单个无状态请求/响应数据交换;它将继续,直到明确关闭。对话通过永久连接进行,允许客户端和服务器发送多个消息,并允许服务器做出相应答复,值得注意的是,还允许服务器向服务端发送异步消息,它和Ajax类似,都是基于现有的技术。本身时一个复合体。一般情况下,SignalR会使用JS的长轮询(long polling),实现客户端和服务端通信。在WebSockets出现以后,SignalR也支持WebSockets通信。当然SignalR也使用了服务端的任务并行处理技术以提高服务器的扩展性。它的目标整个.NET Framework平台,它也不限Hosting的应用程序,而且还是跨平台的开源项目,支持Mono2.10+,觉得它变成时Web API的另一种实作选择,但是它在服务端处理联机的功能上比ASP.NET MVC的Web API要强多了,更重要的是,它可以在Web Form使用

02
领券