Чтение созданных заголовков по выполненному результату - PullRequest
1 голос
/ 11 марта 2020

Я использую 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);
        }
    }
}

1 Ответ

1 голос
/ 11 марта 2020

Вам нужно прочитать Response заголовки, но не Request

bool isExist = context.HttpContext.Response.Headers.TryGetValue("Pagination", out StringValues vs);
...