未在本地运行时,SignalR 2长轮询&协议&请求超时 [英] SignalR 2 long polling "protocol" request times out when not ran locally

查看:70
本文介绍了未在本地运行时,SignalR 2长轮询&协议&请求超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这里要说明的另一点是,我使用的是组。这可能是问题的一部分,我注意到群组似乎使事情进行得更慢,就好像SignalR在推送通知之后等待群组中的所有用户完成一样。我的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);
        }
    }

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

  • 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-0600(中部标准时间)]SignalR:此浏览器 支持SSE,跳过永久帧。
  • 16:37:31 GMT-0600(中部标准时间)]SignalR:正在打开长轮询请求.
  • 格林尼治标准时间16:37:35-0600(中部标准时间)]SignalR:长轮询超时 正在尝试连接。
  • 16:37:35 GMT-0600(中央标准时间)]SignalR:已中止xhr请求。

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

    /li>
  • 16:37:35 GMT-0600(中部标准时间)]SignalR:正在停止连接。
  • 16:37:35 GMT-0600(中部标准时间)]SignalR:触发Ajax异步中止= 真。

有什么想法吗?

推荐答案

现在2.0.0 SignalR中有一个传输连接超时。听起来SQL底板会减慢连接进程,导致传输超时。

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

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

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

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

$.connection.hub.transportConnectTimeout = 3000;

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

您可以选择修改其中一个值或两个值,只要符合您的需要,都没有关系!

希望这能有所帮助!

这篇关于未在本地运行时,SignalR 2长轮询&协议&请求超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆