SignalR初始连接在页面刷新时非常慢(OnDisconnected上的延迟)

时间:2014-04-24 08:59:41

标签: ninject signalr asp.net-mvc-5

我在MVC5项目中使用SignalR已经有一段时间了,但仅在最近几周我遇到了这个问题。

每次刷新页面或导航到项目中的其他页面时,建立新连接都需要很长时间(3-8秒)。

[09:18:12 GMT+0100 (GMT Daylight Time)] SignalR: Attempting to connect to SSE endpoint 'http://localhost:53516/signalr/connect?transport=serverSentEvents&connectio…3A%22notehub%22%7D%2C%7B%22name%22%3A%22retailpriceindexhub%22%7D%5D&tid=6'. jquery.signalR-2.0.3.min.js:8
[09:18:18 GMT+0100 (GMT Daylight Time)] SignalR: EventSource connected.

虽然通常我不使用它们,但我为服务器上的某个集线器创建了这些覆盖方法,以查看何时触发断点:

    public override Task OnConnected()
    {
        var connectionId = Context.ConnectionId;
        return base.OnConnected();
    }

    public override Task OnReconnected()
    {
        var connectionId = Context.ConnectionId;
        return base.OnReconnected();
    }

    public override Task OnDisconnected()
    {
        var connectionId = Context.ConnectionId;
        return base.OnDisconnected();
    }

这确认在页面刷新时OnDisconnected方法不会立即被调用,但是在上面提到的延迟之后。一旦它被击中,它会立即跟随OnConnected,从那一点开始一切顺利。

最初我认为它类似于:https://github.com/SignalR/SignalR/issues/2719,但是:

  • 这是Chrome的问题(版本31.0.1650.57);我在版本上   34.0.1847.116米
  • 我的问题影响所有浏览器(IE比Chrome或Firefox稍微快一点)
  • 根据该问题OnDisconnected仅在导航到项目中的另一个页面时被延迟 - 在我的案例中OnDisconnected即使我关闭标签页或导航到外部页面也不会立即调用

当我打开一个新标签时,立即建立连接:

[09:31:26 GMT+0100 (GMT Daylight Time)] SignalR: Attempting to connect to SSE endpoint 'http://localhost:53516/signalr/connect?transport=serverSentEvents&connectio…3A%22notehub%22%7D%2C%7B%22name%22%3A%22retailpriceindexhub%22%7D%5D&tid=6'. jquery.signalR-2.0.3.min.js:8
[09:31:26 GMT+0100 (GMT Daylight Time)] SignalR: EventSource connected. 

这向我证明延迟发生在$ .connection.hub.start()和服务器上的OnDisconnected方法之间,但我不知道如何追踪它。

我通过修改Web.config文件启用了服务器端日志记录,但是在日志中看不到任何明显的内容。

另外,我尝试将传输方法更改为longPolling,但问题仍然存在。

类似的发布在SignalR github页面上提到AVG或代理,但在我的情况下这些都不相关。

我已经将signalR软件包(服务器和客户端)以及NewtonSoft.Json更新到最新版本,但无济于事。

1 个答案:

答案 0 :(得分:1)

通过更改我的DbFactory和UnitOfWork绑定的Ninject范围,解决了该问题。我没有在我的问题中包含这部分代码,因为我不知道问题出在哪里。

最初我使用的是InRequestScope。更改为InThreadScope后,连接速度慢的问题消失了,但是我遇到了更多问题,然后使用DbContext生命周期。

来自Ninject.Extensions.NamedScope的InCallScope似乎非常适合我的需求。

Bind<IDbFactory>().To<DbFactory>().InCallScope();
Bind<IUnitOfWork>().To<UnitOfWork>().InCallScope();

如果有人可以解释为什么InRequestScope或默认的InTransientScope对我的项目中的SignalR性能(初始连接)有这样的影响,我很乐意接受它作为答案。