SignalR 2长轮询“协议”请求在未在本地运行时超时

目前我有一个非常健谈的应用程序,需要得到Singleton的支持(参见下面的代码)。 我升级到SignalR 2.0并遵循升级指南,但在将其部署到环境后,有时所有对“协议”的请求都会失败,信号器会中断,当它没有中断时,推送速度非常慢从服务器向客户端发送通知,也许这与使用长轮询有关? 这是我的服务器端代码的样子。

Owin中的配置方法启动类

var hubConfig = new HubConfiguration(); hubConfig.EnableDetailedErrors = true; GlobalHost.DependencyResolver.UseSqlServer(ConfigurationManager.AppSettings["ConnectionString"].ToString()); app.MapSignalR(hubConfig); 

如您所见,我正在使用SQL背板。 这是我的Hub的样子

 public class MyHub : Hub { public void JoinGroup(int someId) { Groups.Add(Context.ConnectionId, someId.ToString()); } public void LeaveGroup(int someId) { Groups.Remove(Context.ConnectionId, someId.ToString()); } } 

这里要说的另一点是我正在使用群组。 这可能是问题的一部分,我注意到群组似乎让事情变得更慢,好像信号器正在等待群组中的所有用户在推出通知后完成。 我的Singleton看起来像这样。

 public class Broadcaster { private readonly static Lazy _instance = new Lazy(() => new Broadcaster(GlobalHost.ConnectionManager.GetHubContext().Clients)); private IHubConnectionContext _context; private Broadcaster(IHubConnectionContext context) { _context = context; } public static Broadcaster Instance { get { return _instance.Value; } } public void UpdateClient(int someId, int moreInfo) { _context.Group(someId.ToString()).Update(someId, moreInfo); } } 

最后,这些是客户端日志的输出。

  • 16:37:25 GMT-0600(中央标准时间)] SignalR:客户订阅了集线器’myhub’。 16:37:25 GMT-0600(中央标准时间)] SignalR:与’/api/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22myhub%22%7D%5D&clientProtocol=1.3’谈判。
  • 然后它尝试连接到SSE端点,但失败了……
  • 16:37:30 GMT-0600(中央标准时间)] SignalR:此浏览器支持SSE,跳过Forever Frame。
  • 16:37:31 GMT-0600(中央标准时间)] SignalR:打开长轮询请求…
  • 格林威治标准时间-06:00(中央标准时间)16:37:35] SignalR:尝试连接时,longPolling超时。
  • 格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:中止xhr请求。

    (订阅集线器上的错误时出错)SignalR错误:错误:无法成功初始化传输。 尝试指定不同的传输或根本不指定自动初始化。

  • 格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:停止连接。
  • 16:37:35 GMT-0600(中央标准时间)] SignalR:发射ajax abort async = true。

有什么想法吗?

所以现在在2.0.0 SignalR中有一个TransportConnectTimeout。 听起来好像让你的SQL背板减慢了连接过程,导致你的传输超时。

您可以通过以下方式修改服务器上的TransportConnectTimeout:

 GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(10); 

因此,每当客户端尝试连接时,它将遵守新的超时。

您还可以在客户端上修改此值。 修改后,客户端将其传输到TransportConnectTimeout并将其添加到服务器,然后将结果用作超时。 以下是修改客户端的方法:

 $.connection.hub.transportConnectTimeout = 3000; 

如果服务器的TransportConnectTimeout为5s,则意味着客户端在尝试连接时将遵循8s超时窗口。

您可以选择修改其中一个值或两个值,无关紧要,满足您的需求!

希望这可以帮助!