Fino ad ora, ho avuto un metodo GET
che sembrava il seguente:Aggiungere un'intestazione di risposta personalizzata in 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()
});
}
Il tutto ha funzionato come un fascino ed è stato bello. Tuttavia, mi è stato detto di recente di inviare la risposta metadata (ovvero, Total
, Count
e Last
proprietà) come intestazioni personalizzate di risposta anziché il corpo della risposta.
Non riesco ad accedere a Response
da ApiController. Ho pensato a un filtro o attributo, ma come avrei ottenuto i valori dei metadati?
Posso mantenere tutte queste informazioni sulla risposta e quindi disporre di un filtro che deserializza la risposta prima di essere inviata al client e creane una nuova con le intestazioni, ma ciò sembra problematico e negativo.
C'è un modo per aggiungere intestazioni personalizzate direttamente da questo metodo su un ApiController
?
Dovrebbe essere semplice come [che] (http://stackoverflow.com/questions/13487012/mvc-4-web-api-add-custom-response-http-header) – Andrei
@Andrei non ho una proprietà 'HttpContext', ma ho uno' ActionContext'. Tuttavia, la proprietà 'Response' di quell'oggetto è' null' e non posso operare con esso. –
è necessario utilizzare ActionContext.Request.CreateResponse() per creare effettivamente una risposta e quindi impostare valori in risposta come un oggetto fortemente tipizzato anziché stringhe – harishr