3

Webサイト認証要求の応答を遅らせて、要求が受信されたときから特定の秒オフセットでサーバーが応答を開始するようにしたい。

たとえば、ユーザーがで認証した場合、遅かれ早かれ、04:00:00で応答が返されるようにします。04:00:05コードが期限に間に合わない場合は、エラーを発生させたいと思います。

これはサーバー側で行う必要があり、使用は避けたいと思いますThread.Sleep。ただし、非同期コントローラーを使用して、リクエストの継続の一部でThread.Sleepを使用して、これを行う方法があるのではないかと考えていました。

ここで誰かが同様の課題に直面したことがありますか、そしてあなたの解決策は何でしたか?

Thread.Sleep応答性を避けて維持しながらこれを行う方法を考えられる人はいますか?

4

2 に答える 2

4

MVC 4(またはMVC 3を使用している場合はAsyncController)で非同期サポートを使用できます

public async Task<ActionResult> GizmosAsync()
{
    var gizmoService = new GizmoService();
    return View("Gizmos", await gizmoService.GetGizmosAsync());
}

待機中のメソッドは、Thread.Sleepを含め、必要な時間を使用できます。

そうすれば、ASP.netが他の要求を処理するのをブロックすることはありません。

于 2012-12-11T01:34:25.423 に答える
3

カスタムActionFiltersを使用できます。

  • リクエストが到着した時間をOnActionExecutingメソッドに記録します。
  • 次に、OnResultExecutedメソッドで結果を検査します。有効な応答である場合は通過させ、許可されていない応答である場合は、記録された開始時間に基づいて必要な遅延でThread.Sleepを使用して遅延させます。

フィルタが認証フィルタ([Authorize]?)の前に実行されていること、または属性ではなくグローバルフィルタを使用している場合は、その前に登録されていることを確認してください。

このように、遅延は許可されたユーザーに影響を与えません。これが、Thread.Sleepを使用したくない理由であると私は思います。デフォルトでは、Thread.Sleepはあまり正確ではありませんが(20ミリ秒程度)、クライアントへのネットワーク遅延によってそれがわかりにくくなるはずです。

于 2012-12-11T01:27:23.280 に答える