c# – 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<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);
        }
    }

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

>格林威治标准时间-0600(中央标准时间)16:37:25] SignalR:客户订阅
集中’myhub’.格林威治标准时间-0600(中央标准时间)16:37:25] SignalR:
与…谈判
‘/api/signalr/negotiate?connectionData=[{\”name\”:\”myhub\”}]\u0026amp;clientProtocol=1.3’.
>然后它尝试连接到SSE端点,但失败了……
>格林威治标准时间-0600(中央标准时间)16:37:30] SignalR:此浏览器
支持SSE,跳过Forever Frame.
>格林威治标准时间-0600(中央标准时间)16:37:31] SignalR:打开长轮询请求…
>格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:longPolling超时时间
试图连接.
>格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:中止xhr请求.

(订阅集线器上的错误时出错)SignalR错误:错误:无法成功初始化传输.尝试指定不同的传输或根本不指定自动初始化.
>格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:停止连接.
>格林威治标准时间-0600(中央标准时间)16:37:35] SignalR:发射ajax abort async =
真正.

有什么想法吗?

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

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

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

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

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

$.connection.hub.transportConnectTimeout = 3000;

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

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

希望这可以帮助!

点赞