目前我有一个非常健谈的应用程序,需要单例的支持(参见下面的代码)。我升级到 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());
}
}
这里要指出的另一点是我正在使用组。这可能是问题的一部分,我注意到组似乎让事情变得更慢,就好像信号器在推出通知后正在等待组中的所有用户完成一样。我的单例看起来像这样。
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);
}
}
最后,这些是客户端日志的输出。
有什么想法吗?
因此,2.0.0 SignalR 中现在有一个 TransportConnectTimeout。听起来 SQL 背板会减慢连接过程,导致传输超时。
您可以通过以下方式修改服务器上的 TransportConnectTimeout:
GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(10);
因此,每当客户端尝试连接时,它都会遵守新的超时。
您也可以在客户端修改该值。修改后,客户端获取 TransportConnectTimeout 并将其添加到服务器,然后使用结果作为超时。修改客户端的方法如下:
$.connection.hub.transportConnectTimeout = 3000;
如果服务器的 TransportConnectTimeout 为 5 秒,则意味着客户端在尝试连接时将遵守 8 秒的超时窗口。
您可以选择修改其中一个值,或同时修改两个值,没关系,只要适合您的需要即可!
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)