.net核心如何将Content-range添加到标头

时间:2018-11-13 21:20:41

标签: .net-core odata

我没有运气找到如何将Content-Range添加到我的odata请求的标头中。我的api需要这样的分页格式:

Content-Range: posts 0-24/319

我能找到的最接近的东西是HTTP字节范围支持。从这里: https://blogs.msdn.microsoft.com/webdev/2012/11/23/asp-net-web-api-and-http-byte-range-support/。 OP表示将撰写有关[Queryable]的帖子,该帖子应该增加对分页的支持,但是我还没有看到任何有关此的信息。

        [EnableQuery]
        [ODataRoute]
        public IActionResult Get(ODataQueryOptions<HC_PortalActivity> 
         options)
        {

            return Ok(Db.HC_PortalActivity_Collection);
        }

2 个答案:

答案 0 :(得分:1)

您可以将Content-Range标头添加到HttpRequest.Content对象:

request.Content.Headers.ContentRange = new System.Net.Http.Headers.ContentRangeHeaderValue(0, 24, 319);

request.Content.Headers.ContentRange.Unit = "posts";

请记住要设置Unit,否则它将默认设置为'bytes'

编辑

Content属性仅在HttpRequestMessage类上可用,而在HttpRequest类上不可用。因此,您将需要创建一个人才能访问ContentRange属性。

var request = new HttpRequestMessage();
... // as above

假设您正在使用HttpClient发送请求,则可以通过SendAsync方法传递请求

var httpClient = new HttpClient();
... // other setup

httpClient.SendAsync(request);

答案 1 :(得分:0)

这就是我最终要做的事情:

  public static void IncludeContentRange<T>(ODataQueryOptions<T> options, HttpRequest context)
        {
            var range = options.Request.Query["range"][0].Replace("[", "").Replace("]", "").Split(',');
            var q = from x in Db.HC_PortalActivity_Collection
                    select x;

            var headerValue = string.Format("{0} {1}-{2}/{3}", options.Context.NavigationSource.Name.ToLower(), range[0], range[1], q.Count());
            context.HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Range");
            context.HttpContext.Response.Headers.Add("Content-Range", headerValue);
        }