我在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,但是:
当我打开一个新标签时,立即建立连接:
[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更新到最新版本,但无济于事。
答案 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性能(初始连接)有这样的影响,我很乐意接受它作为答案。