问题标签 [signalr.client]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
10283 浏览

signalr - SignalR .NET 客户端断开连接

我们遇到了一个有趣的问题。这是我们的设置的样子:

  • Windows Server 2012 上的 SignalR Server(一个 ASP.NET MVC 应用程序)。
  • Sencha HTML5 应用程序(SignalR 客户端)在同一台服务器(Windows Server 2012)上。
  • Windows Server 2008 R2 服务器上的 .NET Windows 服务。这也充当 SignalR 客户端。

最初我们使用的是 SignalR 0.5.3 - 当我们开始观察到 Windows 服务与 Signal R 服务器的连接断开时。这种频率从每隔几分钟到每隔几个小时不等。它在大多数情况下会重新连接,但偶尔会无法重新连接,导致 Windows 服务每隔几天就会失去一次连接。但它没有固定的模式。它与服务器重启/备份等无关。我们在windows服务中添加了日志记录以监视客户端连接上的StateChanged事件,发现在断开连接和重新连接时会触发该事件,但在不重新连接时不会触发。

然后我们遇到了这个线程:客户端不断重新连接

并决定将所有内容升级到 SignalR 1.0.1(无论如何我们都必须在某个时候这样做)。Windows 服务也升级到框架 4.5(从框架 2.0)现在引用新的 Microsoft.AspNet.SignalR.Client.dll。这也允许我们(使用新添加的连接属性)确定 Windows 服务实际上使用的是 ServerSentEvents 协议。在 Windows Server 2012 机器上安装相同的 Windows 服务使用 WebSockets 协议。这与此线程一致:SignalR .NET Client does not support WebSockets on Windows 7

但是,Windows Server 2008 R2 服务器上的服务行为并没有改变。它仍然会断开连接并重新连接,并且偶尔会失去连接。由于一些限制,我们无法将 windows server 2012 用于 windows 服务,并且卡在较旧的操作系统上。这并不是说使用 websockets 协议的 windows 服务可以解决我们所有的问题(我们还没有彻底测试过)。

我们尝试的第三件事是从 GitHub 获取源代码并对其进行编译并升级服务(SignalR 服务器和客户端)——这样做是为了确保我们获得带有任何潜在错误修复的最新副本。

但这并没有帮助。我们现在处于一个我们觉得我们已经用尽了我们的选择的地步。建议将不胜感激。谢谢。

======================================

编辑:更多信息:

好的,现在我们有了更多信息。我们在 windows 服务(SignalR 客户端)中添加了一些代码,以每 30 分钟登录一次 SignalR 服务器(用于测试连接)。

以下是客户端每 30 分钟发生的情况:

其中 trans 是从 Hub 继承的服务器端类的实例,而 WriteEvent 基本上是写入日志文件的跟踪。

并且客户端也有一个'isLoggedIn'方法如下:

在服务器端,我们有登录方法:

如果我们查看客户端日志文件,每 30 分钟我们会收到以下日志条目:

  • 使用 SiteCode = ABCD 执行登录过程。
  • SignalR 服务器:经过身份验证

所以我们知道调用的是服务端登录方法,同时调用了客户端的isLoggedIn方法。

但是,在某些时候,当调用服务器端方法时,不会调用 isLoggedIn 客户端方法。所以每 30 分钟,我们开始只得到一个条目:

  • 使用 SiteCode = ABCD 执行登录过程。

另外,日志事件:

在服务器端登录方法中被写入服务器端日志。所以Clients.Caller.isLoggedIn(True)被按预期调用,但我们在客户端看不到。

所以我猜我们正在查看的是客户端始终能够访问服务器并能够调用服务器端(登录)函数,但服务器无法调用客户端(isLoggedIn)函数,这开始发生在一点。

此外,这可能是 .NET 客户端所特有的,因为我很确定我们没有看到我们的 HTML5/javascript 客户端发生这种情况。

0 投票
6 回答
45819 浏览

signalr - 通过 http 标头 SignalR 传递令牌

我可以看到 HubConnection 中有一个选项可以通过客户端的 url 请求传递参数。有没有办法通过来自 JS 或 .NET 客户端的 http 标头传递特定令牌?

0 投票
2 回答
2059 浏览

signalr - SignalR 客户端的 Java 端口的当前状态是什么?

据我了解,有创建 Java SignalR 客户端的计划,有什么想法会在什么时候完成?我目前正在使用 JavaScript 客户端从 Web 客户端连接到集线器,但我还需要将其扩展到 Android 客户端。

我看到Erik Z写了一个库https://github.com/erizet/SignalA看起来不错,但不幸的是它不支持集线器。是否值得扩展它或正式发布在路上?

0 投票
3 回答
29668 浏览

signalr - SignalR 超时属性

我们遇到了这个链接,它指定了不同的超时属性: https ://github.com/SignalR/SignalR/wiki/Configuring-SignalR

还有这篇关于 SignalR 客户端和 SignalR 服务器之间如何断开和重新连接的精彩帖子(何时重新连接 signalR? )。

只是为了从上面的帖子中重新迭代不同的情况:

“当客户端脱机然后很快重新连接时会发生集线器重新连接。SignalR 配置值在很大程度上决定了以下示例的时间戳,因此不要逐字记录时间。

以下是涉及重新连接行为的几个示例及其结果(时间格式 m:ss):

情况一

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于 ISP 问题而失去连接(并意识到它失去了连接)

0:15 - 客户端重新连接

0:16 - OnReconnected 事件被触发

情况2

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:15 - 客户端重新连接

这里可能会发生两件事

A: 0:16 - 没有任何反应,客户端继续之前的连接

B: 0:~45 - 客户端意识到其断开连接 *

B: 0:46 - 客户端转换到重新连接状态

B: 0:47 - 客户端成功重新连接并触发 OnReconnected 事件。

情况 3

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:~45 - 客户端意识到其断开连接 *

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经离开太久然后忘记它,排队等待客户端接收的“断开连接”命令,如果它稍后重新连接。***

1:15 - OnDisconnect 被触发 1:16 - 客户端重新连接

1:17 - 客户端执行“软”重新连接(不触发 OnReconnected)

1:18 - 客户端检索“断开连接”命令

1:19 - 客户端调用“停止”并进行软断开(不触发 OnDisconnected)

情况4

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:~45 - 客户端意识到其断开连接 *

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经离开太久然后忘记它,排队等待客户端接收的“断开连接”命令,如果它稍后重新连接。***

1:15 - 触发 OnDisconnect 1:30 - 客户端停止尝试重新连接(尝试时间过长)**

1:30 - 客户端转换为断开连接状态

  • 由于客户端保持活动检查:用于确定客户端何时由于缺乏保持活动而离线。不用于长轮询传输

** 由于客户端断开连接超时:用于确定客户端何时重新连接太长时间,并且服务器可能在此期间忘记了客户端

*** 由于服务器断开连接超时:用于确定何时应该忘记客户端。这是一个时间跨度,一旦连接在服务器上被标记为死,就会开始累积。最终,服务器为客户端的主题排队一个断开命令,告诉客户端(如果它重新连接)它需要开始一个新的连接。清理主题后,该命令将从服务器中消失。”


我们发现,我们经常在 .NET SignalR 客户端和 ASP.NET MVC SignalR 服务器之间断开和重新连接(上面的 1 和 2),并且断开连接不会导致重新连接(上面的 3 和 4)。我们知道正在使用 ServerSentEvents 协议。

很难知道我们需要调整(增加或减少)哪些超时属性:

  1. 减少断开和重新连接的次数。
  2. 根本不会出现在情况 3 和 4 中。

这里需要注意的重要一点是,我们的 .NET SignalR 客户端实际上是一个始终连接到服务器的 Windows 服务。

我们目前只保留了默认值,它们是:

  • 连接超时 = 110 秒
  • DisconnectTimeout = 30 秒
  • KeepAlive = 30 秒

此外,我们使用的是 SignalR 1.0.1。

0 投票
1 回答
2008 浏览

signalr - javascript中的SignalR回调

有没有办法为 SignalR 传递回调函数?现在我有我的site.js

我想要的是

这将使我能够为同一个 signalR 方法定义来自网页的不同回调函数。现在我通过在我的网页上定义一个函数来以一种黑客的方式来做这件事

然后通过site.js调用它

它有效,但我想知道是否有更清洁的方法。非常感谢任何帮助。

0 投票
0 回答
1035 浏览

web-services - Azure 云服务中 SignalR 的性能问题

我正在开发一个 Web 服务,该服务存储在 Windows Server 2012 虚拟机上的 Azure 云服务中,该虚拟机使用 SignalR 向连接到 Azure 网站的客户端发送消息。为了测试 SignalR 发送消息的性能,我们设计了一个特殊的端点来模拟发送到客户端的不同消息。

访问端点时,将迭代包含 400 个预定义事件对象的列表。然后将每个对象存储在数据库中,并在存储对象后向客户端发送一条消息,总共应发送 400 条消息。第一条消息到达速度很快,但随后的消息传递速度较慢,所有连接的客户端最多需要 20 分钟(我们目前仅在 Firefox 上打开网站的 5 个客户端进行测试,这对于花了这么长时间)来接收所有的消息。

为了发送消息,我在事件存储到数据库后使用的函数如下所示:

在 Javascript 客户端中,我收到如下消息:

由于 Web 服务存储在 Azure 中,我不知道是否可以从 SignalR 页面尝试性能调整,我没有太多使用 Azure 的经验。我有哪些选择可以提高从 Azure 中的 Web 服务发送消息的速度?

0 投票
1 回答
2591 浏览

signalr - SignalR .NET 客户端超时

这是我们的设置的样子:

  • Windows Server 2012 上的 SignalR Server(一个 ASP.NET MVC 应用程序)。
  • Sencha HTML5 应用程序(SignalR 客户端)在同一台服务器(Windows Server 2012)上。
  • Windows Server 2008 R2 服务器上的 .NET Windows 服务。这也充当 SignalR 客户端。

我们正在使用几周前的 SignalR 开发版本(1.1.0)。有时,我们会发现 SignalR 服务器失去与 .NET 客户端的连接。使用最新版本允许我们添加客户端日志记录。

上周四(2013 年 3 月 28 日下午 6 点 33 分)我们有一个很好的例子。

客户端日志(为简洁起见,我删除了所有不重要的日志)。请注意,Hub 类称为“Transmitter”。

在连接超时之前,一切都按预期工作 - SignalR 服务器可以调用 .NET 客户端的方法,反之亦然。连接超时后,.NET 客户端可以调用服务器 Hub 方法,但服务器无法调用 .NET 客户端方法。

其他需要注意的事项:

  • 请注意,连接超时报告“28/03/2013 8:33:14 AM”作为时间。这与后续条目中记录的时间不同,时间实际上是下午 6:33:14(澳大利亚东部标准时间)。
  • 从上面可以看出,ServerSentEvents 正在使用,因为 SignalR .NET 客户端位于 Windows 2008 服务器上。
  • 超时没有模式。有时它不会在几天内发生,有时它会在几个小时内发生。
  • 超时与重新启动的机器(SignalR 服务器或 SignalR 客户端所在的机器)、IIS 重置等无关。

此外,这与瞬时连接丢失和重新连接完全不同,它们似乎按要求工作。连接中的瞬时丢失示例如下所示:

我不明白为什么瞬时连接丢失和重新连接似乎有效,但连接超时后的重新连接不起作用。

我们能做些什么来解决这个问题吗?

提前致谢。

0 投票
1 回答
1047 浏览

asp.net - 在 SignalR 中调用特定客户端

我正在开发一个 SignalR 应用程序,其中一组 .NET 控制台客户端连接到 Web 服务器。如何使用 SignalR 从服务器调用特定客户端。

在我做的当前应用程序中,当我从服务器端单击按钮时。它触发所有控制台客户端。但我想要触发的是保留 server.html 上的所有客户端信息并调用特定客户端。

目前这是我的控制台应用程序

这是服务器端。

调用客户端的服务器 html

全球.asax

0 投票
0 回答
1935 浏览

asp.net - 信号R获取GetHttpContext

我正在尝试做这里所做的事情:

(即使用httpcontext进行只读)

这就是我想要实现的目标:

1) 在事件发生更改时调用集线器中的 SendMessage 方法

2) SendMessage 调用 Web 服务(可能需要几秒钟)并通过 signalR 发送响应。

- 这是正确的做法吗?我应该改用任务吗,如果可以,我仍然可以访问 this.Context.Request.GetHttpContext() 吗?

-this.Context.Request.GetHttpContext() - 这是我偶尔看到的(这种情况很少发生)但它确实发生了,导致空引用异常(这些属性的一堆是空的):

在此处输入图像描述

0 投票
2 回答
3206 浏览

signalr - 在从 Web 访问的自托管 SignalR 服务器中实现授权

我正在寻找有关如何在自托管(非 IIS)环境中运行的后端服务上实现 SignalR 授权安全的一些指导,该环境是从 Web 应用程序调用的。后端应用程序基本上是一个将 SignalR 事件触发回基于 HTML 的客户端的监视器。这一切都很好(实际上非​​常好)。

但是,我们需要限制来自 Web 站点的经过身份验证的用户对服务器的访问。所以基本上如果一个用户在网站上通过了身份验证,我们需要以某种方式在后端应用程序中获取凭据(用户名就足够了)和验证状态来决定是否允许连接以避免未经授权的访问。

任何人都可以指出一些关于如何完成这种身份验证转发的策略或模式吗?