1

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

现在它使用ajax(使用jquery),只需使用GET到具有不同查询参数的server.aspx,然后返回一些内容。(它打算稍后构建到更大的项目中)

但是我有一件事我无法弄清楚如何为它构建并希望有人有一个绝妙的主意:)

对用户的“保持活力”(或 TimeToLive)服务。该服务应确保当用户断开连接(机器崩溃 - 浏览器/窗口关闭)时,用户从聊天室超时。

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

现在是我的挑战

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

但是如何以及在哪里可以在 .net 中进行此服务器服务?或者你有其他方法吗?:)

4

3 回答 3

2

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

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

我想就是这样:)

于 2011-05-05T07:43:55.347 回答
1

您可以运行一个控制台应用程序(或将其作为Windows 服务运行),该应用程序可以使用一个计时器扫描您的 TTL 列表,该计时器在设定的时间间隔内按您的意愿处理它们。都可以在 .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
    }

}
于 2011-05-05T08:39:07.373 回答
0

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

于 2011-05-05T07:45:26.190 回答