信号行为:防止长轮询

本文关键字:信号 | 更新日期: 2023-09-27 18:11:11

我想在我的web应用程序(c#, mvc)中使用SignalR。

场景:我的用户给我输入,我处理它并向他们显示结果。这个过程可能很长。多久?比方说3分钟(取决于网络流量、使用情况……-不能谓语)。目前,我在AJAX请求长轮询中执行此过程。当AJAX正在运行时,我在屏幕上显示:"请等待"。

现在我给这个场景添加了一个新的服务器限制:因为我使用CloudFlare,他们限制我每个请求必须少于100秒。否则,它们将中止请求。

所以,我正在考虑这个问题,并决定检查移动到SignalR的选项。为什么?因为SignalR可以为我管理这个长轮询。并且大多使用另一种方法(如套接字或其他技术),这可能避免100秒的服务器限制。

我在SignalR网站上看到他们检查客户端功能并决定使用哪种技术。

我的关注:由于CloudFlare将请求'响应限制为100秒,这可能会对SignalR造成问题。假设我的客户端是一个没有任何新web功能(如WebSocket或其他)的客户端。这可能导致SignalR执行长轮询——这可能会失败。

是否可以定义SignalR以避免长轮询?或您建议如何避免这种有问题的情况

信号行为:防止长轮询

SignalR允许您配置服务器将保持长轮询请求打开的最大时间。

默认情况下,SignalR服务器将关闭已打开110秒而未接收消息的轮询请求。当然,如果在110秒之前将消息发送到客户机,则在发送消息时将关闭轮询请求。在这两种情况下,SignalR客户端将在服务器关闭之前的轮询时重新轮询(否则我猜它不会是长轮询)。

您可以使用IConfigurationManager.ConnectionTimeout:

降低应用程序启动时默认的110秒超时。
// Make long polling connections wait a maximum of 60 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(60);

http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events connectiontimeout