ASP.NET有两个优秀的限制/速率限制库。有MVC限制库MvcThrottle和Web API限制库WebApiThrottle。
我正在和谐地使用这两者,直到我需要对安全令牌端点应用速率限制,这不是由Web API提供的,而是由OWIN提供的。幸运的是,WebApiThrottle有一个中间件限制器,可以限制Web API以外的任何东西。
不幸的是,在我应用中间件限制器后,我在访问网站上的页面后开始出现InvalidCastException错误。发生了什么,我该如何解决?
答案 0 :(得分:1)
好吧,我发现问题在于中间件限制器正在处理对网页的任何请求,而MVC调节器也处理对网页的任何请求。每个节流器都在读取和写入相同的缓存,但是当他们从缓存中读取值时,一个人试图将对象强制转换为WebApiThrottle对象,另一个试图将对象强制转换为MvcThrottle对象。那不好。
所以我通过让中间件限制自己精心构建的策略来解决这个问题。默认情况下,策略不会限制任何内容。然后我添加一个规则来专门应用限制到安全令牌端点。
这样安全令牌端点仍然是速率受限的,但网页限制完全由MVC限制属性处理。中间件调节器将忽略在其规则列表中未被覆盖的任何内容,因为默认速率限制均为0,表示没有限制。例外情况消失了,一切都很好。
这是中间件限制策略类的样子:
public class MiddlewareThrottlingPolicy : ThrottlePolicy
{
/// <summary>
/// Creates the middleware throttling policy
/// </summary>
public MiddlewareThrottlingPolicy()
{
//Everything is unthrottled by default. We don't have to do anything to achieve that
//We're throttling by endpoint
EndpointThrottling = true;
//Add the endpoints that get different throttling
RateLimits policySettings = new RateLimits
{
PerSecond = 30,
PerMinute = 100,
PerHour = 200,
PerDay = 500,
PerWeek = 0
};
EndpointRules = new Dictionary<string, RateLimits>
{
{ "/api/authentication/token", policySettings }
};
}
}
在实际应用程序中,我从配置设置加载速率限制,但我在这里简化了它。
这是我在启动应用程序时应用中间件限制策略的方法:
app.Use(typeof(ThrottlingMiddleware),
new MiddlewareThrottlingPolicy(),
new PolicyCacheRepository(),
new CacheRepository(),
null,
null);