/// <inheritdoc />
        public async Task <FluentHttpResponse> Invoke(FluentHttpMiddlewareContext context)
        {
            var request = context.Request;

            var options = request.GetResponseCachingOptions(_options);

            if (options.ShouldIgnore || options.Matcher != null && !options.Matcher(request))
            {
                return(await _next(context));
            }
            var hash = request.GetHash();
            FluentHttpResponse response = null;

            if (!options.IsWriteOnly)
            {
                response = await _service.Get(hash);
            }
            if (response != null)
            {
                foreach (var item in request.Items)
                {
                    response.Items[item.Key] = item.Value;
                }

                _logger.LogInformation("Pre-request - Returning a cached response {hash}", hash);
                return(response);
            }

            response = await _next(context);

            _logger.LogInformation("Post-Response - Caching request... {hash}", hash);
            await _service.Set(hash, response);

            return(response);
        }