diff --git a/WebApiThrottle.WebApiDemo/Helpers/CustomThrottlingHandler.cs b/WebApiThrottle.WebApiDemo/Helpers/CustomThrottlingHandler.cs index 0522dfe..6130fba 100644 --- a/WebApiThrottle.WebApiDemo/Helpers/CustomThrottlingHandler.cs +++ b/WebApiThrottle.WebApiDemo/Helpers/CustomThrottlingHandler.cs @@ -1,20 +1,21 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using System.Web; namespace WebApiThrottle.WebApiDemo.Helpers { public class CustomThrottlingHandler : ThrottlingHandler { - protected override RequestIdentity SetIdentity(System.Net.Http.HttpRequestMessage request) + protected override Task SetIdentityAsync(System.Net.Http.HttpRequestMessage request) { - return new RequestIdentity() + return Task.FromResult(new RequestIdentity() { ClientKey = request.Headers.Contains("Authorization-Key") ? request.Headers.GetValues("Authorization-Key").First() : "anon", ClientIp = base.GetClientIp(request).ToString(), Endpoint = request.RequestUri.AbsolutePath.ToLowerInvariant() - }; + }); } } } \ No newline at end of file diff --git a/WebApiThrottle/ThrottlingFilter.cs b/WebApiThrottle/ThrottlingFilter.cs index 7f1a93c..1b6faf7 100644 --- a/WebApiThrottle/ThrottlingFilter.cs +++ b/WebApiThrottle/ThrottlingFilter.cs @@ -129,7 +129,7 @@ public ThrottlePolicy Policy /// public HttpStatusCode QuotaExceededResponseCode { get; set; } - public override void OnActionExecuting(HttpActionContext actionContext) + public override async Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken) { EnableThrottlingAttribute attrPolicy = null; var applyThrottling = ApplyThrottling(actionContext, out attrPolicy); @@ -145,7 +145,7 @@ public override void OnActionExecuting(HttpActionContext actionContext) core.Repository = Repository; core.Policy = Policy; - var identity = SetIdentity(actionContext.Request); + var identity = await SetIdentityAsync(actionContext.Request); if (!core.IsWhitelisted(identity)) { @@ -219,17 +219,24 @@ public override void OnActionExecuting(HttpActionContext actionContext) } } - base.OnActionExecuting(actionContext); + await base.OnActionExecutingAsync(actionContext, cancellationToken); } + + [Obsolete("This method is deprecated, use SetIdentityAsync instead")] protected virtual RequestIdentity SetIdentity(HttpRequestMessage request) + { + throw new NotImplementedException("This method is deprecated, use SetIdentityAsync instead"); + } + + protected virtual Task SetIdentityAsync(HttpRequestMessage request) { var entry = new RequestIdentity(); entry.ClientIp = core.GetClientIp(request).ToString(); entry.Endpoint = request.RequestUri.AbsolutePath.ToLowerInvariant(); entry.ClientKey = request.Headers.Contains("Authorization-Token") ? request.Headers.GetValues("Authorization-Token").First() : "anon"; - return entry; + return Task.FromResult(entry); } protected virtual string ComputeThrottleKey(RequestIdentity requestIdentity, RateLimitPeriod period) diff --git a/WebApiThrottle/ThrottlingHandler.cs b/WebApiThrottle/ThrottlingHandler.cs index 7bdcd40..0b05509 100644 --- a/WebApiThrottle/ThrottlingHandler.cs +++ b/WebApiThrottle/ThrottlingHandler.cs @@ -129,7 +129,7 @@ public ThrottlePolicy Policy /// public HttpStatusCode QuotaExceededResponseCode { get; set; } - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // get policy from repo if (policyRepository != null) @@ -139,17 +139,17 @@ protected override Task SendAsync(HttpRequestMessage reques if (policy == null || (!policy.IpThrottling && !policy.ClientThrottling && !policy.EndpointThrottling)) { - return base.SendAsync(request, cancellationToken); + return await base.SendAsync(request, cancellationToken); } core.Repository = Repository; core.Policy = policy; - var identity = SetIdentity(request); + var identity = await SetIdentityAsync(request); if (core.IsWhitelisted(identity)) { - return base.SendAsync(request, cancellationToken); + return await base.SendAsync(request, cancellationToken); } TimeSpan timeSpan = TimeSpan.FromSeconds(1); @@ -204,7 +204,7 @@ protected override Task SendAsync(HttpRequestMessage reques : string.Format(message, rateLimit, rateLimitPeriod); // break execution - return QuotaExceededResponse( + return await QuotaExceededResponse( request, content, QuotaExceededResponseCode, @@ -214,7 +214,7 @@ protected override Task SendAsync(HttpRequestMessage reques } // no throttling required - return base.SendAsync(request, cancellationToken); + return await base.SendAsync(request, cancellationToken); } protected IPAddress GetClientIp(HttpRequestMessage request) @@ -222,7 +222,13 @@ protected IPAddress GetClientIp(HttpRequestMessage request) return core.GetClientIp(request); } + [Obsolete("This method is deprecated, use SetIdentityAsync instead")] protected virtual RequestIdentity SetIdentity(HttpRequestMessage request) + { + throw new NotImplementedException("This method is deprecated, use SetIdentityAsync instead"); + } + + protected virtual Task SetIdentityAsync(HttpRequestMessage request) { var entry = new RequestIdentity(); entry.ClientIp = core.GetClientIp(request).ToString(); @@ -231,7 +237,7 @@ protected virtual RequestIdentity SetIdentity(HttpRequestMessage request) ? request.Headers.GetValues("Authorization-Token").First() : "anon"; - return entry; + return Task.FromResult(entry); } protected virtual string ComputeThrottleKey(RequestIdentity requestIdentity, RateLimitPeriod period) diff --git a/WebApiThrottle/ThrottlingMiddleware.cs b/WebApiThrottle/ThrottlingMiddleware.cs index a9be672..06ec480 100644 --- a/WebApiThrottle/ThrottlingMiddleware.cs +++ b/WebApiThrottle/ThrottlingMiddleware.cs @@ -140,7 +140,7 @@ public override async Task Invoke(IOwinContext context) core.Repository = Repository; core.Policy = policy; - var identity = SetIdentity(request); + var identity = await SetIdentityAsync(request); if (core.IsWhitelisted(identity)) { @@ -213,7 +213,13 @@ public override async Task Invoke(IOwinContext context) await Next.Invoke(context); } + [Obsolete("This method is deprecated, use SetIdentityAsync instead")] protected virtual RequestIdentity SetIdentity(IOwinRequest request) + { + throw new NotImplementedException("This method is deprecated, use SetIdentityAsync instead"); + } + + protected virtual Task SetIdentityAsync(IOwinRequest request) { var entry = new RequestIdentity(); entry.ClientIp = request.RemoteIpAddress; @@ -222,7 +228,7 @@ protected virtual RequestIdentity SetIdentity(IOwinRequest request) ? request.Headers.GetValues("Authorization-Token").First() : "anon"; - return entry; + return Task.FromResult(entry); } protected virtual string ComputeThrottleKey(RequestIdentity requestIdentity, RateLimitPeriod period)