[ResponseCache(Duration = 20)]//, VaryByQueryKeys = new string[] { "PageIndex", "PageSize" } public async Task <ActionResult <ResponseColloctionResource <AuthorDto> > > GetAuthorsAsync([FromQuery] ResourcesParameters resourcesParameters) { //获取数据 var authors = await repositoryWrapper.Author.GetPageAsync(resourcesParameters); #region 验证客户端缓冲 ////验证客户端缓冲 和缓冲中间建分开用,可以考虑和imemorycache配合使用 //var authorHash = HashFactory.GetHash(authors); //Response.Headers[HeaderNames.ETag] = authorHash; //if (Request.Headers.TryGetValue(HeaderNames.IfNoneMatch, out var requestHash) && authorHash == requestHash) //{ // return StatusCode(StatusCodes.Status304NotModified); //} //否则返回全部响应信息 #endregion var name = System.Net.WebUtility.UrlEncode(resourcesParameters.AuthorName); var pageData = new { pageIndex = authors.PageIndex, pageSize = authors.PageSize, totalPages = authors.TotalPages, totalCount = authors.TotalCount, previousLink = authors.HasPrevious ? Url.Link(nameof(GetAuthorsAsync), new { pageindex = resourcesParameters.PageIndex - 1, pageSize = resourcesParameters.PageSize, authorName = name }) : null, nextLink = authors.HasNext ? Url.Link(nameof(GetAuthorsAsync), new { pageindex = resourcesParameters.PageIndex + 1, pageSize = resourcesParameters.PageSize, authorName = name }) : null, authorName = name }; var str = JsonConvert.SerializeObject((pageData)); Response.Headers.Add("PageMessage", JsonConvert.SerializeObject((pageData))); var authorDtos = mapper.Map <IEnumerable <AuthorDto> >(authors); var linkAuthorDtos = new ResponseColloctionResource <AuthorDto>(authorDtos.Select(author => CreateLinksForAuthor(author)).ToList()); return(CreateLinksForAuthors(linkAuthorDtos, pageData)); }
/// <summary> /// 超文本驱动(实现HATEOAS 超媒体作为应用状态的引擎) /// </summary> /// <param name="author"></param> /// <returns></returns> private ResponseColloctionResource <AuthorDto> CreateLinksForAuthors(ResponseColloctionResource <AuthorDto> authors, dynamic pageData = null) { authors.Links.Add(new Link(HttpMethods.Post, "create a author", Url.Link(nameof(CreateAuthorAsync), null))); if (pageData != null) { authors.Links.Add(new Link(HttpMethods.Get, "previous", pageData.previousLink)); authors.Links.Add(new Link(HttpMethods.Get, "next", pageData.nextLink)); } return(authors); }