如何为聊天应用创建“Keep Alive”?

时间:2011-05-05 07:38:51

标签: c# asp.net webforms livechat

目前我正在做一个聊天网络应用,其中多个用户可以聊天,它可以控制多个房间。它的工作和完成工作。

现在它使用ajax(使用jquery)并且只使用带有不同查询参数的server.aspx GET然后返回一些内容。(它意味着稍后将构建到一个更大的项目中)

但我有一件事我无法弄清楚如何为它建造并且让人有一个出色的想法:)

用户使用“Keep Alive”(或TimeToLive)服务。该服务应确保用户断开连接(机器崩溃 - 浏览器/窗口关闭),用户从聊天室中退出。

我的想法是,在用户对服务器的每个请求中,它应该更新TTL列表(带有用户ID和“时间戳”的列表),这部分很容易。

现在来了挑战

然后应该在服务器上运行一些服务,继续检查这个TTL列表以查看是否有任何标记已用完,以及是否已将用户从房间中删除

但是我如何以及在哪里可以在.net中执行此服务器服务?或者你有另一个approch? :)

3 个答案:

答案 0 :(得分:2)

我只会有一个名为“LastPing”的表,其中包含用户ID和日期。 放置一段javascript,定期调用你网站上的一个页面(window.setInterval(...)) - 该页面只是用当前日期时间更新表格,或者如果没有更新行则进行插入。

最后,创建一个sql server作业/任务,从Lastping中选择用户ID,其中date早于currentdate - 30分钟(或其他)。这些用户ID将从任何聊天室等中删除,最后从LastPing表中删除。

我认为就是这样:)

答案 1 :(得分:1)

您可以运行Console Application(或将其作为Windows Service运行),可以扫描您在设定的时间间隔内打勾的TTL列表using a Timer,以便根据需要进行处理。可以在.net中完成所有操作,防止您必须将业务逻辑存储在SQL Server中的SSIS包中。

如果您沿着这条路走下去,我建议您编写一个也可以作为控制台应用程序运行的Windows服务。查询Environment.UserInteractive属性以确定正在运行的版本 - 这将有助于您的开发,因为控制台应用程序可能比Windows服务更冗长。

以下是代码示例:

public partial class Service1 : ServiceBase
{
    //Need to keep a reference to this object, else the Garbage Collector will clean it up and prevent further events from firing.
    private System.Threading.Timer _timer;

    static void Main(string[] args)
    {
        if (Environment.UserInteractive)
        {
            var service = new Service1();
            Log.Debug("Starting Console Application");

            service.OnStart(args);
            // The service can now be accessed.
            Console.WriteLine("Service ready.");
            Console.WriteLine("Press <ENTER> to terminate the application.");
            Console.ReadLine();
            service.OnStop();

            return;
        }
        var servicesToRun = new ServiceBase[] 
                                          { 
                                              new Service1() 
                                          };
        Run(servicesToRun);
    }

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        // For a single instance, this is a bit heavy handed, but if you're creating of a number of them
        // the NT service will need to return in a short period of time and thus I use QueueUserWorkItem
        ThreadPool.QueueUserWorkItem(SetupTimer, args);
    }

    protected override void OnStop()
    {
    }

    private void SetupTimer(object obj)
    {


        //Set the emailInterval to be 1 minute by default
        const int interval = 1;
        //Initialize the timer, wait 5 seconds before firing, and then fire every 15 minutes
        _timer = new Timer(TimerDelegate, 5000, 1, 1000 * 60 * interval);
    }
    private static void TimerDelegate(object stateInfo)
    {
            //Perform your DB TTL Check here
    }

}

答案 2 :(得分:0)

对于这种类型的解决方案,您需要设置一个单独的Thread,定期检查用户是否过期,或者将库用于计划任务,并类似地设置计划任务。