Joh*_*ean 2 c# asp.net rate-limiting asp.net-web-api
我正在编写一个类,可以将其用作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响应?
您可以抛出HttpResponseException:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (TooManyRequests()) {
throw new HttpResponseException((HttpStatusCode)429);
}
base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
即使该值不是枚举的一部分,也可以将429强制转换为HttpStatusCode(来自C#语言规范5.0)。