1

global.asaxファイルのキャッシュに格納されているアプリケーション レベルの変数があります。

 void Application_Start(object sender, EventArgs e) 
    {
        Application.Lock();
        List<MyClassName> myobjects = new List<MyClassName>();
        HttpContext.Current.Cache["List"] = myobjects;
        Application.UnLock();        
    }

そして、私はそれにアクセスして、ページで変更します:

protected void Page_Load(object sender, EventArgs e)
{
   List<MyClassName> myobjects = (List<MyClassname>)HttpContext.Current.Cache["List"];
   //change myobjects...
   HttpContext.Current.Cache["List"] = myobjects;
}

質問: *このサイトを同時に実行している 2 人のユーザー (ブラウザー) がいるとします (たとえば、チャット中)。あるユーザーがmyobjects変数を変更したときに別のユーザーに通知する方法は?*

myobjects をチェックし、タイマーを使用して定期的にこれを古いものと比較することができます。しかし、それは最善の方法ではありません。

グローバル変数が変更されたときに別のユーザーに通知するより良い方法はありますか?

4

1 に答える 1

1

Web サーバーの場合、http プロトコルのステートレス性を考慮すると、ユーザーや接続ユーザーのようなものはなく、要求とその応答だけです。ユーザーに通知したいと言うときは、サーバーが通信を開始することを伝えようとしていますが、これは不可能です。

考えられるのは、ロングポーリングを使用することです。つまり、リクエストを継続的に有効にし、ユーザーに何かを通知したいときはいつでもデータをフィードしますが、これはスケーラブルなソリューションではありません-少なくともリソースの少ないサーバー(のもちろん、グーグルはそれを買う余裕があります)

何かを通知するには、ユーザーがサーバーに接続している必要があります。つまり、クライアント側から通信を開始する必要があります。

もう 1 つの方法は、ソケットを使用することです。カスタム サーバーを作成し、値が変更されたことを Web アプリケーションにカスタム サーバーに通知させることができます。カスタム サーバーは、ソケット (Web ソケット) を使用してクライアントに通知します。ただし、これはかなり複雑なメカニズムです。html 5 によって提供される websockets を使用するか、flash/java などのアドオンを使用して、ソケット通信を解決できます。

于 2012-10-12T13:05:09.357 に答える