4

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

Owin启动类中的配置方法

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

如您所见,我使用的是 SQL 背板。这是我的集线器的样子

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());
    }
}

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

public class Broadcaster
    {
        private readonly static Lazy<Broadcaster> _instance =
            new Lazy<Broadcaster>(() => new Broadcaster(GlobalHost.ConnectionManager.GetHubContext<MyHub>().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:打开长轮询请求以...
  • 16:37:35 GMT-0600(中部标准时间)] SignalR:尝试连接时长轮询超时。
  • 16:37:35 GMT-0600(中部标准时间)] SignalR:中止 xhr 请求。

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

  • 16:37:35 GMT-0600(中部标准时间)] SignalR:停止连接。
  • 16:37:35 GMT-0600(中部标准时间)] SignalR:已触发 ajax abort async = true。

有什么想法吗?

4

1 回答 1

5

所以现在在 2.0.0 SignalR 中有一个 TransportConnectTimeout。听起来您的 SQL 背板正在减慢连接过程,从而导致您的传输超时。

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

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

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

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

$.connection.hub.transportConnectTimeout = 3000;

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

您可以选择修改其中一个值,也可以修改两个值,没关系,只要适合您的需要!

希望这可以帮助!

于 2013-11-08T00:23:12.960 回答