Как создать "Keep Alive" для приложения чата? - PullRequest
1 голос
/ 05 мая 2011

В данный момент я создаю веб-приложение для чата, в котором несколько пользователей могут общаться, и оно может контролировать несколько комнат. Его работа и выполнение работы.

Сейчас он использует ajax (используется jquery) и просто использует GET для server.aspx с другими параметрами запроса, а затем возвращает некоторый контент. (Он должен быть встроен в более крупный проект позже)

Но у меня есть одна вещь, которую я не могу понять, как построить для нее, и надеюсь, у кого-то была прекрасная идея :)

Служба "Keep Alive" (или TimeToLive) для пользователей. Служба должна обеспечивать, когда пользователь отключается (сбой машины - закрытие браузера или окна), когда пользователь выходит из чата.

Моя идея заключалась в том, что при каждом запросе пользователя к серверу он должен обновлять список TTL (список с идентификатором пользователя и «отметкой времени»), и эта часть проста.

Теперь приходит мой вызов

Тогда на сервере должна быть запущена какая-то служба, которая постоянно проверяет этот список TTL, чтобы определить, закончились ли какие-либо штампы и удалил ли он пользователя из комнаты.

Но как и где я могу сделать этот серверный сервис в .net? Или у вас есть другой подход? :)

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Я бы просто имел таблицу с именем LastPing с идентификатором пользователя и датой.Поместите фрагмент javascript, который вызывает страницу на вашем сайте через регулярные промежутки времени (window.setInterval (...)) - эта страница просто обновляет таблицу с указанием даты и времени или выполняет вставку, если строки не обновляются.

Наконец, создайте задание / задачу sql server, которое выбирает идентификатор пользователя из Lastping, где дата старше текущей даты - 30 минут (или что-то еще).Эти идентификаторы пользователей удаляются из любых комнат чата и т. Д. И, наконец, удаляются из таблицы LastPing.

Я думаю, что вот и все:)

1 голос
/ 05 мая 2011

Вы можете запустить Консольное приложение (или запустить его как Служба Windows ), которое может сканировать ваш список TTL , используя Таймер , который помечается на множествеинтервал для их обработки, как вы хотите.Все это может быть сделано в .net, не позволяя вам хранить бизнес-логику в пакете служб SSIS на сервере SQL.

Если вы идете по этому пути, я бы порекомендовал написать службу 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
    }

}
0 голосов
/ 05 мая 2011

Для этого типа решения вам потребуется настроить отдельный Thread, который периодически проверяет срок действия пользователей, или использовать библиотеку для запланированных задач и аналогичным образом настроить запланированную задачу.

...