一段时间后,Web套接字停止响应

时间:2018-05-25 13:37:37

标签: c# websocket windows-services slack slack-api

我有一个使用websocket(从http://sta.github.io/websocket-sharp/)连接到Slack并监视消息的Windows服务。

我的连接代码如下所示:

ws = new WebSocket(connection.Url);

ws.OnMessage += async (sender, e) =>
{
    var msg = JsonConvert.DeserializeObject<MessageFromSlack>(e.Data);
    if (msg.Type == "message" && msg.Text != null && msg.User != UserId)
    {
        if (userMatcher.IsMatch(msg.Text))
        {
            await ProcessDirectMessage(msg);
        }
        await ProcessMessage(msg);
    }
    if (msg.Type == "channel_joined")
    {
        await ChannelJoined(msg.ChannelModel.Id);
    }
};

ws.OnClose += (sender, e) =>
{
    var reason = e.Reason;
    var code = e.Code;
    System.Diagnostics.Debug.WriteLine($"{code}:{reason}");
};

ws.Connect();

基本上它会等待一条消息然后如果它指向@我的机器人,它会调用ProcessDirectMessage,如果不是,它会调用ProcessMessage。我认为,这些功能的细节并不重要(它们会进行一些匹配,寻找关键短语并通过发回信息进行回复)。

一切正常。一阵子。但经过一段时间(通常超过一天),它只是完全停止响应。我的OnMessage处理程序永远不会被击中。我想也许正在发生的事情是websocket在服务器端被关闭了,所以我添加了OnClose处理程序,但这似乎永远不会被击中。

有人知道这里会发生什么吗?有没有办法保持连接存活,或者在它死亡时重新连接?

1 个答案:

答案 0 :(得分:2)

根据TCP连接的性质 - 检测其消失的唯一可靠方法是向其写入内容。如果你只是在阅读(等待数据到达) - 你可以在很长一段时间内完成这项任务,而另一方则很长时间没死。如果另一方没有正常关闭连接(这涉及交换一些TCP数据包),就会发生这种情况。

Web套接字协议定义了特殊的Ping帧,以及相应的Pong帧,您应该使用它来避免问题中描述的情况。有时您应该发送Ping帧并等待(特定超时)服务器以Pong帧响应。如果它在给定的超时内没有响应 - 假设连接已经死亡并重新连接。

据我所知 - 您使用的库不会代表您自动发送ping请求。但是,它允许您通过Ping方法执行此操作。

您需要使用

配置超时
ws.WaitTime = TimeSpan.FromSeconds(5);

然后,不时(例如 - 当你在过去X秒内没有收到任何新消息时),请执行:

bool isAlive = ws.Ping();

还有boolean属性也是如此:

bool isAlive = ws.IsAlive;

这是一个阻止呼叫(上述两种情况)。如果服务器在Pong间隔期间回复ws.WaitTime,则返回true,否则返回false。然后你可以采取相应的行动。