【发布时间】:2015-08-18 07:05:12
【问题描述】:
我在 Azure 上有一个 C# SignalR 客户端 (2.2) 和 ASP.NET MVC SignalR 服务器。当在服务器端创建一个新的“实体”时,它会使用以下内容向客户端推送一个简单的通知:
public static class EntityHubHelper
{
private static readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<EntityHub>();
public static void EntityCreated(IdentityUser user, Entity entity)
{
_hubContext.Clients.User(user.UserName).EntityCreated(entity);
}
}
[Authorize]
public class EntityHub : Hub
{
// Just tracing overrides for OnConnected/OnReconnected/OnDisconnected
}
客户端或服务器偶尔会重新连接,这是意料之中的,但我看到两者都重新连接(例如重新启动 Web 服务器)但随后客户端停止获取数据的情况。
这似乎发生在 1-2 天没有数据被推送之后,然后最终推送被错过。
我们的客户追踪:
15/08/02 03:57:23 DEBUG SignalR: StateChanged: Connected -> Reconnecting
15/08/02 03:57:28 DEBUG SignalR: Error: System.Net.WebSockets.WebSocketException (0x80004005): Unable to connect to the remote server ---> System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
15/08/02 03:57:31 DEBUG SignalR: Error: System.Net.WebSockets.WebSocketException (0x80004005): Unable to connect to the remote server ---> System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
15/08/02 03:57:47 DEBUG SignalR: StateChanged: Reconnecting -> Connected
15/08/02 03:57:47 INFO SignalR OnReconnected
我们的服务器追踪:
8/2/2015 3:57:57 AM [SignalR][OnReconnected] Email=correspondinguser@example.com, ConnectionId=ff4e472b-184c-49d4-a662-8b0e26da43e2
我使用服务器默认值进行 keepalive 和超时(10 秒和 30 秒),它通常使用 websockets(在 Azure 上启用,标准因此没有限制)。
我有两个问题:
(1) 在 websocket 情况下,客户端如何发现服务器已重新启动(在这种情况下,它会丢失对所述客户端存在的记忆)?是否服务器的 10s/30s 设置在初始连接期间被推低,客户端决定服务器在 30s 后消失?
(2) 如何调试这种情况?有什么方法可以证明客户端实际上仍在接收保活,所以我知道我在其他地方遇到了一些灾难性问题?
【问题讨论】:
标签: .net signalr signalr.client