每个用户的SignalR队列限制

问题描述:

我有这段代码来测试SignalR中的异步编程。此代码在10秒后将文本发送回客户端。每个用户的SignalR队列限制

public class TestHub : Hub 
{ 
    public async Task BroadcastMessage(string text) 
    { 
     await DelayResponse(text); 
    } 

    async Task DelayResponse(string text) 
    { 
     await Task.Delay(10000); 
     Clients.All.displayText(text); 
    } 
} 

此代码工作正常,但有一个意外的行为。当发送5条消息的时间少于10秒时,直到先前的“DelayResponse”方法结束,客户端才能发送更多消息。它发生在每个连接上,如果在10秒钟之前关闭连接并重新打开它,客户端可以再次发送5条消息。我用Chrome,Firefox和IE测试它。 我犯了一些错误或者是信号的限制?

您很可能会触及浏览器限制。当使用longPolling和serverSentEvent传输时,每个发送都是一个单独的HTTP请求。由于您在延迟响应,因此这些请求的运行时间较长,并且浏览器限制了可以打开多少个并发连接。一旦你达到极限,一个新的连接将不会开放,直到前一个连接完成。 关于并发请求的更多细节限制: Max parallel http connections in a browser?

+0

这是完全正确的。我在不支持websocket的Windows 7上工作,因此我的电脑上的信号传输类型是“ServerSentEvents”,因此达到了浏览器连接限制。当我在支持websockets的windows 10上测试我的代码时,没有任何限制。我连续发送约500条消息,然后在10秒后得到500条回应。 –

这不是signalR的敏感,您等待“长时间运行”的任务。对于那个signalR支持服务器推送机制。 所以,如果你有什么需要更多的时间,你可以从客户端触发。 在计算完成的情况下,您可以从服务器向客户端发送消息。