/// <summary> /// Limits the number of concurrent requests that can be handled used by the subsequent stages in the owin pipeline. /// </summary> /// <param name="builder">The OWIN builder instance.</param> /// <param name="options">The max concurrent request options.</param> /// <returns>The OWIN builder instance.</returns> /// <exception cref="System.ArgumentNullException">builder</exception> /// <exception cref="System.ArgumentNullException">options</exception> public static BuildFunc MaxConcurrentRequests(this BuildFunc builder, MaxConcurrentRequestOptions options) { builder.MustNotNull("builder"); options.MustNotNull("options"); builder(_ => MaxConcurrentRequests(options)); return builder; }
/// <summary> /// Limits the number of concurrent requests that can be handled used by the subsequent stages in the owin pipeline. /// </summary> /// <param name="builder">The IAppBuilder instance.</param> /// <param name="options">The max concurrent request options.</param> /// <returns>The IAppBuilder instance.</returns> /// <exception cref="System.ArgumentNullException">builder</exception> public static IAppBuilder MaxConcurrentRequests(this IAppBuilder builder, MaxConcurrentRequestOptions options) { builder.MustNotNull("builder"); options.MustNotNull("options"); builder .UseOwin() .MaxConcurrentRequests(options); return builder; }
/// <summary> /// Limits the number of concurrent requests that can be handled used by the subsequent stages in the owin pipeline. /// </summary> /// <param name="options">The max concurrent request options.</param> /// <returns>An OWIN middleware delegate.</returns> /// <exception cref="System.ArgumentNullException">options</exception> public static MidFunc MaxConcurrentRequests(MaxConcurrentRequestOptions options) { options.MustNotNull("options"); int concurrentRequestCounter = 0; return next => async env => { int maxConcurrentRequests = options.MaxConcurrentRequests; if (maxConcurrentRequests <= 0) { maxConcurrentRequests = int.MaxValue; } try { int concurrentRequests = Interlocked.Increment(ref concurrentRequestCounter); options.Tracer.AsVerbose("Concurrent counter incremented."); options.Tracer.AsVerbose("Checking concurrent request #{0}.", concurrentRequests); if (concurrentRequests > maxConcurrentRequests) { options.Tracer.AsInfo("Limit of {0} exceeded with #{1}. Request rejected.", maxConcurrentRequests, concurrentRequests); IOwinResponse response = new OwinContext(env).Response; response.StatusCode = 503; response.ReasonPhrase = options.LimitReachedReasonPhrase(response.StatusCode); return; } options.Tracer.AsVerbose("Request forwarded."); await next(env); } finally { Interlocked.Decrement(ref concurrentRequestCounter); options.Tracer.AsVerbose("Concurrent counter decremented."); } }; }