[解決済み] ASP.NET MVCでリクエストスロットルを実装するための最良の方法は?
2022-04-08 07:15:06
質問
において、ユーザーのアクションをスロットルするための様々な方法を試しています。 指定された時間帯 :
- 質問・回答の投稿を制限する
- 編集を制限する
- フィードの取得を制限する
当面は、キャッシュを使用して、ユーザーのアクティビティのレコードを単純に挿入し、ユーザーが同じアクティビティを行ったときにそのレコードが存在すれば、スロットルを使用します。
キャッシュを使えば、自動的に古いデータのクリーニングとユーザーのアクティビティウィンドウのスライドが可能になりますが、どのようにスケールするかは問題かもしれません。
リクエスト/ユーザーアクションを効果的にスロットルできるようにする他の方法はありますか(安定性重視)?
解決方法は?
ここでは、過去1年間Stack Overflowで使用してきたものの一般的なバージョンを紹介します。
/// <summary>
/// Decorates any MVC route that needs to have client requests limited by time.
/// </summary>
/// <remarks>
/// Uses the current System.Web.Caching.Cache to store each client request to the decorated route.
/// </remarks>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ThrottleAttribute : ActionFilterAttribute
{
/// <summary>
/// A unique name for this Throttle.
/// </summary>
/// <remarks>
/// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
/// </remarks>
public string Name { get; set; }
/// <summary>
/// The number of seconds clients must wait before executing this decorated route again.
/// </summary>
public int Seconds { get; set; }
/// <summary>
/// A text message that will be sent to the client upon throttling. You can include the token {n} to
/// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
/// </summary>
public string Message { get; set; }
public override void OnActionExecuting(ActionExecutingContext c)
{
var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
var allowExecute = false;
if (HttpRuntime.Cache[key] == null)
{
HttpRuntime.Cache.Add(key,
true, // is this the smallest data we can have?
null, // no dependencies
DateTime.Now.AddSeconds(Seconds), // absolute expiration
Cache.NoSlidingExpiration,
CacheItemPriority.Low,
null); // no callback
allowExecute = true;
}
if (!allowExecute)
{
if (String.IsNullOrEmpty(Message))
Message = "You may only perform this action every {n} seconds.";
c.Result = new ContentResult { Content = Message.Replace("{n}", Seconds.ToString()) };
// see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
}
}
}
使用例です。
[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
return Content("TestThrottle executed");
}
ASP.NETキャッシュは、ここでも素晴らしい働きをします。これを使うことで、スロットル・エントリーを自動的にクリーンアップすることができるのです。 また、トラフィックが増加しているにもかかわらず、サーバー上の問題であることが確認されていません。
この方法についてのフィードバックはお気軽にお寄せください。 イウォーク修正 をさらに早くすることができます:)
関連
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み] ELMAHをASP.NET MVCの[HandleError]属性で動作させる方法は?
-
[解決済み] ASP.Net MVCのmodelStateからすべてのエラーを取得する方法は?
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み] ASP.NET MVCコントローラは、Imageを返すことができますか?
-
[解決済み] [Solved] ASP.NET MVCで404を適切に処理するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Automapperにタイプマップの設定がない、またはマッピングがサポートされていない - エラー
-
[解決済み] コントローラ '...' でパブリックアクションメソッド '...' が見つかりませんでした。
-
[解決済み] RedirectToActionでURLが変更されない、またはIndexビューに移動しない
-
[解決済み】1つのビューに複数のモデルを表示する
-
[解決済み】TextBoxFor()からは日付のみ。)
-
[解決済み] [Solved] Replace line break characters with <br /> in ASP.NET MVC Razor view
-
[解決済み】MVC 4 @Scripts "does not exist".
-
[解決済み】ASP.NET MVC 3 Razor - EditorForにクラスを追加する。
-
[解決済み] mvc 4 で部分ビューにパラメータを渡すにはどうすればよいですか?
-
[解決済み] ASP.NET MVCのモデルでUrlHelperを呼び出す