Esempio n. 1
0
        private void MaybeCacheObject(ActionExecutedContext context)
        {
            if (!(context.Result is OkObjectResult result))
            {
                return;
            }

            var body = result.Value;

            var cacheKey = context.HttpContext.Request.GetDisplayUrl();
            var json     = JsonSerializer.Serialize(body, _options);
            var etag     = _generator.GenerateFromBuffer(Encoding.UTF8.GetBytes(json));

            context.HttpContext.Response.Headers.Add(HeaderNames.ETag, new[] { etag });
            _cache.Save(cacheKey, etag);

            var members = AccessorMembers.Create(body, AccessorMemberTypes.Properties, AccessorMemberScope.Public);

            foreach (var member in members)
            {
                if (member.HasAttribute <CacheTimestampAttribute>())
                {
                    var accessor = ReadAccessor.Create(body);
                    if (accessor.TryGetValue(body, member.Name, out var lastModifiedDate))
                    {
                        switch (lastModifiedDate)
                        {
                        case DateTimeOffset timestamp:
                            context.HttpContext.Response.Headers.Add(HeaderNames.LastModified,
                                                                     timestamp.ToString("R"));
                            _cache.Save(cacheKey, timestamp);
                            break;

                        case DateTime timestamp:
                            context.HttpContext.Response.Headers.Add(HeaderNames.LastModified,
                                                                     timestamp.ToString("R"));
                            _cache.Save(cacheKey, timestamp);
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        private void MaybeCacheObject(ActionExecutedContext context)
        {
            if (!(context.Result is OkObjectResult result))
            {
                return;
            }

            var cacheKey = context.HttpContext.Request.GetDisplayUrl();
            var json     = JsonConvert.SerializeObject(result.Value, _settings);
            var etag     = _generator.GenerateFromBuffer(Encoding.UTF8.GetBytes(json));

            context.HttpContext.Response.Headers.Add(Constants.HttpHeaders.ETag, new[] { etag });
            _cache.Save(cacheKey, etag);

            // HQ.Data.Contracts: auto-enrich results with Last-Modified.
            if (result.Value is IObject resource)
            {
                var lastModifiedDate = resource.CreatedAt;
                context.HttpContext.Response.Headers.Add(Constants.HttpHeaders.LastModified,
                                                         lastModifiedDate.ToString("R"));
                _cache.Save(cacheKey, lastModifiedDate);
            }
        }