我们正在尝试各种方法来限制用户在给定时间段内的操作:
目前,我们正在使用Cache来简单地插入用户活动的记录 - 如果用户执行相同活动时存在该记录,我们就会加油.
使用缓存自动为我们提供过时的数据清理和用户的滑动活动窗口,但它如何扩展可能是一个问题.
还有哪些其他方法可以确保可以有效地限制请求/用户操作(强调稳定性)?
在ASP.NET中有一个System.Web.HttpRequest类,它包含ServerVariables可以从REMOTE_ADDR属性值为我们提供IP地址的属性.
但是,我找不到类似的方法从ASP.NET Web API获取远程主机的IP地址.
如何获取发出请求的远程主机的IP地址?
我正在编写一个类,可以将其用作ASP.NET Web API操作的属性,该操作将根据用户的IP地址对用户进行限制。
该类的逻辑工作正常,其基本结构如下所示:
public class ThrottleAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// Do various logic to determine if we should respond with a 429
base.OnActionExecuting(actionContext);
}
}
Run Code Online (Sandbox Code Playgroud)
通过[Throttle]在方法定义上方添加注释,我将其用于控制器动作。
OnActionExecuting我想在方法中的某个地方返回带有429HTTP代码的响应。通过查看其他SO帖子(例如此帖子),看来我可以使用以下内容来做到这一点:
actionContext.Response = actionContext.Request.CreateResponse(
HttpStatusCode.Conflict,
Message.Replace("{n}", Seconds.ToString())
);
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此代码时,出现以下错误:
'System.Net.Http.HttpRequestMessage'不包含'CreateResponse'的定义,并且找不到扩展方法'CreateResponse'接受类型为'System.Net.Http.HttpRequestMessage'的第一个参数(您是否缺少using指令?或装配参考?)
显然,该CreateResponse方法在上不存在HttpRequestMessage,但是我不知道该如何返回自定义响应来告诉用户他们已经达到了速率限制。我也试过这个:
actionContext.Response.StatusCode = HttpStatusCode.BadRequest;
Run Code Online (Sandbox Code Playgroud)
但是,这也导致有关未将对象引用设置为对象实例的错误。
我该如何429 Too Many Requests从班级返回一个响应,或者失败,仅返回一个Bad Request响应?