Я использую Asp. Net Core 3.1 в качестве сервиса Rest Api. Я использовал кэш-память для хранения результатов после вызова действий, Проблема в том, что я создал собственные заголовки для действий перед возвратом объекта, и мне также нужно кэшировать эти заголовки, но я не могу получить к нему доступ при использовании OnResultExecuted на фильтрах действий Веб-интерфейс:
[CachingResource(Prefixe = CachingPrefixes.Contents)]
[HttpGet("{typeId}")]
public async Task<IActionResult> Get(int typeId, [FromQuery]GetContentsParams prms)
{
ApiPagedList<C_ContentLoc> items = await _rep.GetItemsLocPaged(typeId, prms);
IEnumerable<ContentDto> dto = _mapper.Map<IEnumerable<ContentDto>>(items);
Response.AddPaginationHeader(items.CurrentPage, items.PageSize, items.TotalCount, items.TotalPages);
return Ok(dto);
}
Добавить расширение заголовка нумерации страниц:
public static void AddPaginationHeader(this HttpResponse response, int currentPage, int pageSize, int totalItems, int numberOfPages)
{
var paginationHeader = new PaginationHeader(currentPage, pageSize, numberOfPages, totalItems);
//create header object
var camelCaseFormatter = new JsonSerializerSettings();
camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
response.Headers.Add("Pagination", JsonConvert.SerializeObject(paginationHeader, camelCaseFormatter));
//give the client access to this header
response.AddExposeHeader("Pagination");
}
Фильтр ресурса кэширования по выполненному результату:
public override void OnResultExecuted(ResultExecutedContext context)
{
if (!isInCache && !string.IsNullOrEmpty(cacheKey))
{
if (context.Result is OkObjectResult result)
{
bool isExist = context.HttpContext.Request.Headers.TryGetValue("Pagination", out StringValues vs);
if(isExist)
{
//no result !
}
_cache.Set(cacheKey, result.Value);
CachingHelper.SaveCacheKeys(Prefixe, cacheKey, _cache);
}
}
}