protected async Task TryGetRevalidatedResult(IHandlerContextWithResult handlerContext, HttpRequestMessage request, HttpResponseMessage response) { if (!Enabled) { return; } var context = GetContext(handlerContext); var result = (CacheEntry)context.Items["CacheHandlerCachedItem"]; var meta = CachingHelpers.CreateResponseMetadata(result, request, response, context); if (result == null || !context.RevalidateValidator(context, meta)) { return; } if (!result.IsEmpty && result.Value != null) { result.UpdateResponseMetadata(request, response, context); context.ResultInspector?.Invoke(result); } else { result = CacheEntry.Empty; } if (result.IsEmpty) { var missedResult = await context.HandlerRegister.OnMiss(context); if (missedResult.IsDirty) { result = new CacheEntry(missedResult.Value, null); } } if (!result.IsEmpty) { var hitResult = await context.HandlerRegister.OnHit(context, result.Value); if (hitResult.IsDirty && !(bool)hitResult.Value) { handlerContext.Result = result.Value; } } context.Items["CacheHandlerCachedItem"] = result; }
protected async Task TryGetFromCache(IHandlerContextWithResult handlerContext) { if (!Enabled) { return; } var context = GetContext(handlerContext); var requestValidation = context.RequestValidator(context); if (requestValidation != RequestValidationResult.OK) { await ExpireResult(context, requestValidation); return; } var result = await _cacheManager.Get(context); var responseValidation = ResponseValidationResult.NotExist; if (!result.IsEmpty) { context.ResultInspector?.Invoke(result); responseValidation = context.ResponseValidator(context, result.Metadata); } // TODO: Determine the need for conditional put - if so, that logic would go here if (responseValidation == ResponseValidationResult.Stale && !context.AllowStaleResultValidator(context, result.Metadata)) { responseValidation = ResponseValidationResult.MustRevalidate; } if (responseValidation == ResponseValidationResult.MustRevalidate && context.Request != null) { if (result.Metadata.ETag != null) { context.Request.Headers.Add("If-None-Match", result.Metadata.ETag); } else if (result.Metadata.LastModified != null) { context.Request.Headers.Add("If-Modified-Since", result.Metadata.LastModified.Value.ToString("r")); } //hang on to this we are going to need it in a sec. We could try to get it from cache store, but it may have expired by then context.Items["CacheHandlerCachedItem"] = result; return; } if (result.IsEmpty) { var missedResult = await context.HandlerRegister.OnMiss(context); if (missedResult.IsDirty) { result = new CacheEntry(missedResult.Value, null); } } if (!result.IsEmpty) { var hitResult = await context.HandlerRegister.OnHit(context, result.Value); if (!hitResult.IsDirty || !(bool)hitResult.Value) { handlerContext.Result = result.Value; } } context.Items["CacheHandlerCachedItem"] = result; }