1

現時点では、複数のユーザーがチャットでき、複数の部屋を制御できるチャット Web アプリを実行しています。それは機能し、仕事を成し遂げます。

現在、ajax(jqueryが使用されています)を使用しており、異なるクエリパラメーターを使用してserver.aspxにGETを使用し、コンテンツを返します(後でより大きなプロジェクトに組み込むことを意図しています)。

しかし、私はそれを構築する方法を理解できないことが1つあり、誰かが素晴らしいアイデアを持っていることを願っています:)

ユーザーに対する "Keep Alive" (または TimeToLive) サービス。このサービスは、ユーザーが切断したとき (マシンのクラッシュ - ブラウザー/ウィンドウを閉じる) に、ユーザーがチャット ルームからタイムアウトすることを保証する必要があります。

私の考えは、ユーザーからサーバーへのすべての要求で、TTL リスト (ユーザー ID と「タイムスタンプ」を含むリスト) を更新する必要があり、この部分は簡単であるというものでした。

今、私の挑戦が来ました

次に、この TTL リストを継続的にチェックして、スタンプがなくなったかどうか、およびルームからユーザーを削除したかどうかを確認するサービスがサーバー上で実行されている必要があります。

しかし、.net でこのサーバー サービスをどこでどのように実行できますか? それとも別のアプローチがありますか?:)

4

3 に答える 3

2

ユーザーIDと日付を含む「LastPing」のようなテーブルを作成するだけです。サイトのページを定期的に呼び出す JavaScript を配置します (window.setInterval(...))。そのページは、現在の日時でテーブルを更新するか、行が更新されていない場合は挿入を行います。

最後に、日付が currentdate - 30 分 (または何でも) よりも古い Lastping からユーザー ID を選択する SQL サーバー ジョブ/タスクを作成します。これらのユーザー ID はチャット ルームなどから削除され、最終的に LastPing テーブルから削除されます。

私はそれについてだと思います:)

于 2011-05-05T07:43:55.347 に答える
1

コンソール アプリケーションを実行する(またはWindows サービスとして実行する) ことができます。このアプリケーションは、設定した間隔でタイマーを使用して TTL リストをスキャンし、必要に応じて処理することができます。すべてを .net で実行できるため、ビジネス ロジックを SQL サーバー内の 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 に答える