2014-09-04 33 views
14

我使用SignalR来实现聊天在asp.net中,但是当我打开我的web应用程序的多个选项卡时,我得到“正在等待可用套接字...”在ASP.NET中使用SignalR等待可用的套接字

我已经实现了Performance Tuning SignalR指定的所有设置,但我的问题没有得到解决。

我该如何解决这个问题?

+1

你只是试图让基本演示运行?或者你是否真的试图调整一个真正的应用程序? – mason 2014-09-04 14:30:05

+0

你从哪里得到这个聊天应用程序的代码,或者你是从头开始写的? – 2014-09-04 14:32:06

+0

我从头开始编写它,当我打开超过5个标签时,标签加载....除非我关闭previos标签 – 2014-09-04 14:33:13

回答

8

正如评论中已经指出的那样,您击中了由浏览器强制执行的connection limit per hostname

你的基本选项

    是在其UI选项卡,因此用户不必使用浏览器标签
  • 分享以某种方式连接
  • 单页的应用程序,例如在this question
  • 独立的子域
+0

Hoppner如何实现单独的子域概念。我是否必须在所有域上部署我的集线器类? 还是有什么办法吗?因为我有cretae 5子域名,我把连接作为 $ .connection.hub.url ='subdomain url'; – 2014-09-11 04:58:36

+0

您可以为每个位置部署它并使用背板连接实例;或者也许可以简单地使用URL重写/自定义路由(我从来没有尝试过,所以可能会有并发症) – 2014-09-11 09:00:05

+0

请你给我提供一些实现使用URL重写的例子的想法,因为我已经尝试在多个服务器上部署,但我的聊天消息不起作用..由于连接ID对于多个集线器不常见 – 2014-09-11 10:21:18

1

讨论您可以实现锁定机制,使每多个选项卡只有一个连接。

  1. 店这个锁在本地存储
  2. 其设置为true打开之前新的连接,释放它(设置为false)关闭连接之前(您可能需要在window.beforeunload反应的价值事件)。
  3. 创建一个定时器,定期检查此锁的值。 (您需要这样做是因为用户可以关闭活动连接所在的选项卡)仅当此锁的值为false时才打开新连接。
  4. 将接收到的消息从活动标签广播到其他标签(被动标签)。将消息值存储在本地存储中,而其他选项卡定期检查此值是否有新值。被动选项卡应该存储上次恢复的消息的时间戳,并仅查找此时间戳较新的消息。

此解决方案将帮助您处理最大并联连接限制。

0

在与这个问题斗争之后,我通过使用子域概念解决了这个问题。 为此,我创建了多个指向主站点的子域,每次指定不同域的集线器URL时,我都能够打开每个域的大约5个选项卡。 这个技巧对我来说工作得很好。

与本地存储
0

的解决方案是在这个小项目实施:

https://github.com/slimjack/IWC-SignalR

我想在我的应用程序,可以强烈推荐,因为它为我工作。我在Chrome,Firefox和IE上测试过它,并对性能感到满意。

请记住,你应该包括IWC万国表all.min.js,IWC万国表signalr.js和参考<script src="signalr/hubs"></script>signalr-patch.js

它已准备好与jQuery 1合作。7或更高。只需稍作更改,我就可以使用1.6.4版本运行它。