2012-02-23 10 views
1

私はthis質問にフックしたいと思いますが、多分別の角度から言い換えてください。ASP.NET Webアプリケーションで待機操作を実行していますか?

不正行為の防止のため、一定のログイン試行が間違っていると訪問者をブロックしたいと考えています。この時点で私は実際の関数呼び出しをloginにラップするマネージャクラスを持っています。ビジターがブロックされているため、実際のログインメソッドが呼び出されない場合、マネージャーは例外をスローします。ここまでは順調ですね。

例外投げの部分をThread.Sleepに変更したいと思います。しかしこれはオプションではありません。これはサーバーへの他のリクエストをブロックするためです。 easyこのシナリオではおそらくasync waitコマンドを使用するか、おそらくF#を使用していますか?

現在のコード:

class Manager { 
    void Execute(Action action) { 
     if(user.IsBlocked) 
      throw new BlockedException(); 
     else 
      action(); 
    } 
} 

優先コード:

class Manager { 
    void Execute(Action action) { 
     if(user.IsBlocked) 
      //Wait for xxx minutes 


     action(); 
    } 
} 
+0

単純にブロックの期間を同じデータベースに保存して、ユーザーの資格情報を保存しないのはなぜですか? –

答えて

1

はこの方法が本当にすぐにリソースを食べるそれをやって。サーバー上に複数のスレッドを必要としません(最終的に応答を送信できるようになるまで、ビジターの数とブロックの時間に応じて数十もの場合があります)。また、何が起こっているのかはビジターには分かりません。まるであなたのサーバがちょうど応答していないかのように見えます(これは本当です)。 より良い方法は、例外を投げつけ続け、もっと優雅に処理することです。たとえば、javascriptを使用して、再度試してみるまで、クライアントにカウントダウンを表示します。

+0

これが初期の解決策です。しかし、これはユーザがログインするためにサーバに別の要求を送ることを必要とする。このコードは実際にはログインシナリオ用ではなく、ループ内で実行されるその他のもの用です。ログインのシナリオは説明が簡単でした。しかし、この「待機」操作でもリソース(私がここで見つけようとしているもの、そしてそこには訪問者がたくさんいる)を食べるならば、これは無駄であり、現在の解決策はそのまま残るでしょう。 – ReFocus

+0

待機する時間によって異なりますが、この待機操作は新しい要求を処理するだけでなく、より多くのリソースをほぼ確実に消費します。考えてみると、すべてのリクエストには一定のオーバーヘッドがあります(特に複雑なことを行う場合は特にそうです)。ブロック期間が過ぎるまでメモリを解放することはできません。それに加えて、何が起こっているのかを知っているユーザーのメリット(JavaScriptを使って新しいリクエストの送信を自動化することもできます)を追加すると、サーバー上で待機するのが方法ではないということに同意します。 – EPLKleijntjens

3

一定の時間だけ遅れているタスクを作成することができます(ヘルパーメソッドはすでに利用可能ですが、TaskEx.Delayを使用しています)、その間にスレッドを縛らないでください。

http://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern

Console.WriteLine("Before await"); 
await TaskEx.Delay(1000); 
Console.WriteLine("After await"); 

ので、 "// xxxの分待ち" になります "待つTaskEx.Delay(TimeSpan.FromMinutes(XXX))"

現在地の例を見ることができます

+0

私はこれがスレッドを縛るのではないことを理解します。しかし、これは潜在的にサーバー上のスレッドを待っている大量の負荷を引き起こす可能性がありますか? – ReFocus

+1

ASP.NETスレッドが待機していません - それは待つ要求です。 ASP.NETスレッドはすぐにスレッドプールに返されます。遅延が終了すると、ASP.NETスレッドがスレッドプールから取得され、要求を続行する(可能であれば完了させる)ために使用されます。 –

関連する問題