SignalR行为:阻止长轮询

时间:2014-07-03 07:48:30

标签: c# asp.net-mvc signalr signalr-hub signalr.client

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

场景:我的用户给我输入并处理它并向他们显示结果。 这种处理可能很长。多久?让我们说3分钟(取决于网络流量,使用情况,...... - 无法预测)。 目前,我在AJAX请求中执行此过程进行长轮询。当AJAX运行时,我在屏幕上显示:“请稍等”。

现在我在这个场景中添加了一个新的服务器限制:由于我正在使用CloudFlare,他们限制我每个请求必须花费不到100秒。否则,他们会中止请求。

所以,我就是这样,并决定检查进入SignalR的选项。为什么?因为SignalR可以为我管理这个长时间的轮询。并且大多使用另一种方法(如套接字或其他技术),这可能会避免这种100秒的服务器限制。

我正在阅读SignalR网站,他们正在检查客户端功能并决定使用哪种技术。

我的顾虑:由于CloudFlare将请求\响应限制为100秒,这可能会对SignalR造成问题。假设我的客户端是客户端,没有任何新的Web功能(如WebSocket或其他)。这可能导致SignalR进行长时间的轮询 - 这可能会失败。

可以定义SignalR以避免长轮询吗? 要么 你如何建议避免这种有问题的案例。

1 个答案:

答案 0 :(得分:5)

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