2015-03-31 3 views
2

Я использую этот код для возврата содержимого объекта, но я хотел бы кэшировать ответ, добавляя заголовки Cache-Control.Web API 2.0 Кэш IHttpActionResult

[AllowAnonymous] 
[Route("GetPublicContent")] 
[HttpGet] 
public IHttpActionResult GetPublicContent([FromUri]UpdateContentDto dto) 
     { 

      if (dto == null) 
       return BadRequest(); 

      var content = _contentService.GetPublicContent(dto); 
      if (content == null) 
       return BadRequest(); 
      return new Ok(content); 

     } 

Только это! Благодаря!!

ответ

0

Вы можете установить его как этот

public HttpResponseMessage GetFoo(int id) { 
var foo = _FooRepository.GetFoo(id); 
var response = Request.CreateResponse(HttpStatusCode.OK, foo); 
response.Headers.CacheControl = new CacheControlHeaderValue() 
{ 
Public = true, 
MaxAge = new TimeSpan(1, 0, 0, 0) 
}; 
return response; 
} 

Update

Или попробуйте это question

+0

Nop! Мне нужно вернуть IHttpActionResul, а не HttpResponseMessage. Благодаря! – chemitaxis

+0

Обновлен мой ответ с помощью ссылки SO –

1

Создайте новый класс, который наследуется от OkNegotiatedContentResult<T>:

public class CachedOkResult<T> : OkNegotiatedContentResult<T> 
{ 
    public CachedOkResult(T content, TimeSpan howLong, ApiController controller) : base(content, controller) 
    { 
     HowLong = howLong; 
    } 

    public CachedOkResult(T content, IContentNegotiator contentNegotiator, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) 
    : base(content, contentNegotiator, request, formatters) { } 

    public TimeSpan HowLong { get; private set; } 


    public override async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     var response = await base.ExecuteAsync(cancellationToken); 
     response.Headers.CacheControl = new CacheControlHeaderValue() { 
      Public = false, 
      MaxAge = HowLong 
     }; 

     return response; 
    } 
} 

Чтобы использовать эту функцию в ваш контроллер, просто верните новый экземпляркласс:

public async Task<IHttpActionResult> GetSomething(string id) 
{ 
    var value = await GetAsyncResult(id); 
    // cache result for 60 seconds 
    return new CachedOkResult<string>(value, TimeSpan.FromSeconds(60), this); 
} 

Коллекторы придут через проволоку, как это:

Cache-Control:max-age=60 
Content-Length:551 
Content-Type:application/json; charset=utf-8 
... other headers snipped ... 
Смежные вопросы