До сих пор я был метод GET
, который был похож на следующее:Добавить пользовательский заголовок ответа в ApiController
protected override async Task<IHttpActionResult> GetAll(QueryData query)
{
// ... Some operations
//LINQ Expression based on the query parameters
Expression<Func<Entity, bool>> queryExpression = BuildQueryExpression(query);
//Begin to count all the entities in the repository
Task<int> countingEntities = repo.CountAsync(queryExpression);
//Reads an entity that will be the page start
Entity start = await repo.ReadAsync(query.Start);
//Reads all the entities starting from the start entity
IEnumerable<Entity> found = await repo.BrowseAllAsync(start, queryExpression);
//Truncates to page size
found = found.Take(query.Size);
//Number of entities returned in response
int count = found.Count();
//Number of total entities (without pagination)
int total = await countingEntities;
return Ok(new {
Total = total,
Count = count,
Last = count > 0 ? GetEntityKey(found.Last()) : default(Key),
Data = found.Select(e => IsResourceOwner(e) ? MapToOwnerDTO(e) : MapToDTO(e)).ToList()
});
}
Это работало как шарм, и это было хорошо. Тем не менее, мне недавно сказали, чтобы отправить ответ метаданные (то есть Total
, Count
и Last
) в качестве ответных пользовательских заголовков вместо тела ответа.
Я не могу получить доступ к Response
от ApiController. Я думал о фильтре или атрибуте, но как бы получить значения метаданных?
Я могу хранить всю эту информацию в ответе, а затем фильтр, который будет десериализовать ответ перед отправкой клиенту и создать новый с заголовками, но это кажется хлопотным и плохим.
Есть ли способ добавить пользовательские заголовки непосредственно из этого метода на ApiController
?
Должно быть так же просто, как [это] (http://stackoverflow.com/questions/13487012/mvc-4-web-api-add-custom-response-http-header) – Andrei
@Andrei У меня нет свойство «HttpContext», но у меня есть «ActionContext». Однако свойство 'Response' этого объекта является« null », и я не могу работать с ним. –
вам нужно использовать ActionContext.Request.CreateResponse(), чтобы на самом деле создать ответ, а затем установить значения в ответ как строго типизированный объект, а не строки – harishr