これまでは、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
) をレスポンス本文の代わりにレスポンスカスタムヘッダーとして使用します。
Response
ApiController からアクセスできません。フィルターまたは属性を考えましたが、メタデータ値を取得するにはどうすればよいでしょうか?
応答に関するこのすべての情報を保持し、クライアントに送信する前に応答を逆シリアル化するフィルターを用意して、ヘッダーを使用して新しい応答を作成することもできますが、これは面倒で良くないようです。
このメソッドからカスタム ヘッダーを直接追加する方法はありますかApiController
?
ベストアンサー1
次のようなメソッドでカスタム ヘッダーを明示的に追加できます。
[HttpGet]
[Route("home/students")]
public HttpResponseMessage GetStudents()
{
// Get students from Database
// Create the response
var response = Request.CreateResponse(HttpStatusCode.OK, students);
// Set headers for paging
response.Headers.Add("X-Students-Total-Count", students.Count());
return response;
}
詳細については、次の記事をお読みください。http://www.jerriepelser.com/blog/paging-in-aspnet-webapi-http-headers/