Comment faire pour limiter les demandes dans les Api Web?
Je suis en train de mettre en œuvre la limitation des requêtes via le suivant:
La meilleure façon de mettre en œuvre la limitation des requêtes en ASP.NET MVC?
J'ai tiré de ce code dans ma solution et décoré d'une API contrôleur de point de terminaison avec l'attribut:
[Route("api/dothis/{id}")]
[AcceptVerbs("POST")]
[Throttle(Name = "TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
[Authorize]
public HttpResponseMessage DoThis(int id) {...}
Cette compile, mais l'attribut code ne pas se faire frapper, et la limitation ne fonctionne pas. Je ne reçois pas toutes les erreurs si. Ce qui me manque?
Vous devez vous connecter pour publier un commentaire.
Vous semblez être source de confusion action des filtres pour une ASP.NET MVC contrôleur et l'action des filtres pour une ASP.NET Web API contrôleur. Ceux sont 2 des classes complètement différentes:
System.Web.Mvc.ActionFilterAttribute
-> c'est ce que vous avez obtenu à partir du lienSystem.Web.Http.Les filtres.ActionFilterAttribute
-> c'est ce que vous avez besoin pour mettre en œuvreIl semble que ce que vous avez montré est une Web API contrôleur de l'action (qui est déclarée à l'intérieur d'un contrôleur découlant de
ApiController
). Donc, si vous voulez appliquer des filtres personnalisés pour cela, ils doivent dériver deSystem.Web.Http.Filters.ActionFilterAttribute
.Donc, nous allons aller de l'avant et d'adapter le code de l'API Web:
où la
GetClientIp
méthode vient dece post
.Maintenant, vous pouvez utiliser cet attribut sur votre site Web API contrôleur de l'action.
this.Request
justerequest
dans leGetClientIp
méthode, non? Sinon je vous 'ne peut pas résoudre symbole". C'est d'une grande aide, merci beaucoup.GetClientIp(actionContext.Request)
.La solution proposée n'est pas exacte. Il y a au moins 5 raisons pour cela.
Il y a beaucoup plus de problèmes et obstacles cachés pour résoudre mise en œuvre de la limitation. Il y a open-source et gratuit options disponibles. Je vous recommande de chercher à https://throttlewebapi.codeplex.com/, par exemple.
WebApiThrottle est tout à fait le champion de maintenant dans ce domaine.
C'est super facile à intégrer. Il suffit d'ajouter le suivant à
App_Start\WebApiConfig.cs
:Il est disponible comme un nuget trop avec le même nom.
ClientWhitelist = new List<string> { "admin-key" }
ClientRules = new Dictionary<string, RateLimits> { { "api-client-key-1", new RateLimits { PerMinute = 40, PerHour = 400 } }, { "api-client-key-9", new RateLimits { PerDay = 2000 } } }
Un Double contrôle de l'
using
déclarations dans votre action de filtre. Comme vous êtes en utilisant une API contrôleur, s'assurer que vous faites référence à la ActionFilterAttribute dansSystem.Web.Http.Filters
et pas l'un dansSystem.Web.Mvc
.ActionExecutingContext
, qui, je crois, doit maintenant êtreHttpActionContext
- il maintenant. Merci!!!!Je suis en utilisant
ThrottleAttribute
de limiter le taux d'appel de mon court-envoi d'un message de l'API, mais je l'ai trouvé ne fonctionne pas parfois. L'API peut être appelé plusieurs fois jusqu'à ce que la manette des gaz logique fonctionne, enfin je suis en utilisantSystem.Web.Caching.MemoryCache
au lieu deHttpRuntime.Cache
et le problème semble résolu.Mes 2 cents, c'est d'ajouter quelques informations supplémentaires pour la "clef" à propos de la demande d'infos sur les paramètres, de sorte que les différents paramètre de requête est accordée à partir de la même adresse IP.
Aussi, mon peu d'inquiétude au sujet de la "clientIP", est-il possible que deux autre utilisateur d'utiliser le même fournisseur d'accès a la même "clientIP'? Si oui, alors un client de mon être limitée à tort.