2016-06-28 9 views
1

Я пытаюсь кэшировать ответ на запросы конечной точки webapi.ДелегированиеHandler для кэширования HttpResponseMessage

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

Что я делаю неправильно? или как я могу сделать это правильно?

Это мой DH:

public class StuffCache : DelegatingHandler 
{ 
    public const string URL_CACHED = @"/stuff-endpoint/items"; 

    ObjectCache cache = MemoryCache.Default; 

    public StuffCache() 
    { 
     cache = MemoryCache.Default; 
    } 

    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     if (request.Method == HttpMethod.Get) 
     { 
      if (request.RequestUri.AbsolutePath.ToLower() == URL_CACHED) 
      { 
       HttpResponseMessage response = (HttpResponseMessage)cache["CachedItemName"]; 

       if (response == null) 
       { 
        response = await base.SendAsync(request, cancellationToken); 
        cache.Add("CachedItemName", response, null); 
       } 

       return response; 
      } 
     } 

     return await base.SendAsync(request, cancellationToken); 
    } 

} 
+0

Кэшированные ответные заголовки? – Legends

+0

Весь ответ, все –

+0

Да, но вы должны добавить заголовки ответа кэша, прежде чем кэшировать весь ResponseMessage! – Legends

ответ

1

Cimpress.Extensions.Http.Caching.InMemory представляет собой пакет NuGet, который предлагает различные вспомогательные методы, связанные с HTTP, в частности HttpMessageHandler что кэширует результаты запроса HTTP GET.

Код DelegatingHandler может быть found on GitHub.

Один из моментов, который следует учитывать, заключается в том, чтобы кэшировать результат HttpResonseMessage.Content отдельно, поскольку поток, особенно сетевой поток, предназначен для чтения только один раз.

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

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