2014-11-27 6 views
2

У меня есть следующий метод:Как получить доступ в ответ ApiController

private async Task<IHttpActionResult> UseHttpCache(Func<Task<IHttpActionResult>> operation) { 
     IHttpActionResult result = await operation(); 
     //Add HTTP Headers here... 
} 

Но я не удается найти какой-либо ссылки на Response в ControllerContext.

Я мог бы наложить IHttpActionResult на HttpResponseMessage и легко установить там заголовки, но я не являюсь поклонником downcasting интерфейса для реализации.

Есть ли способ установить заголовки ответа в ApiController?

ответ

1

Не совсем уверен, что это работает, так как я не могу проверить его прямо сейчас, но как насчет этого.

Определите пользовательские действия результата класс, который украшает оригинальный результат и добавляет значение заголовков:

public class CachedResult : IHttpActionResult 
{ 
    private readonly IHttpActionResult _decorated; 
    private readonly TimeSpan _maxAge; 

    public CachedResult(IHttpActionResult decorated, TimeSpan maxAge) 
    { 
     _decorated = decorated; 
     _maxAge = maxAge; 
    } 

    public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     var response = await _decorated.ExecuteAsync(cancellationToken); 
     response.Headers.CacheControl = new CacheControlHeaderValue 
     { 
      Public = true, 
      MaxAge = _maxAge 
     }; 

     return response; 
    } 
} 

А затем передать в конфигурации, которую вы хотите через конструктор. Например:

private async Task<IHttpActionResult> UseHttpCache(Func<Task<IHttpActionResult>> operation) 
{ 
    IHttpActionResult result = await operation(); 
    var maxAge = TimeSpan.FromHours(1); 
    return new CachedResult(result, maxAge); 
} 
+0

Это путь. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^