到目前为止,我有一个看起来像下面这样的GET
方法:
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
属性)发送到响应自定义头部而不是响应正文。
我无法从ApiController中访问Response
。我想过使用过滤器或属性,但如何获取元数据值呢?
我可以将所有这些信息保存在响应中,然后使用一个过滤器,在将响应发送给客户端之前反序列化响应,并创建一个新的带有头部的响应,但这似乎很麻烦而且不好。
是否有一种方法可以直接从ApiController
的此方法添加自定义标头?
HttpContext
属性,但我有一个ActionContext
属性。然而,该对象的Response
属性是null
,我无法操作它。 - Matias CiceroOk<T>(T t)
方法。这也包括为我设置一些标头)。如果我创建一个响应,我必须手动序列化我的对象并设置所有标头。 - Matias CiceroTask<IHttpActionResult>
,不能隐式转换为HttpResponseMessage
。他需要的是:public IHttpActionResult Get() { return base.ResponseMessage(Request.CreateResponse()); }
- nkalfov