WebApiThrottle中间件限制与MvcThrottle属性冲突

时间:2016-07-22 22:19:59

标签: asp.net asp.net-mvc asp.net-web-api throttling rate-limiting

ASP.NET有两个优秀的限制/速率限制库。有MVC限制库MvcThrottle和Web API限制库WebApiThrottle

我正在和谐地使用这两者,直到我需要对安全令牌端点应用速率限制,这不是由Web API提供的,而是由OWIN提供的。幸运的是,WebApiThrottle有一个中间件限制器,可以限制Web API以外的任何东西。

不幸的是,在我应用中间件限制器后,我在访问网站上的页面后开始出现InvalidCastException错误。发生了什么,我该如何解决?

1 个答案:

答案 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);