2013-02-14 1 views
4

Я разрабатываю службу RESTful Web API на платформе Azure.Кэширование запросов GET с веб-интерфейсом API на Azure

Я думал, что поведение кэширования на клиентской стороне по умолчанию будет заключаться в кешировании запросов GET (поскольку GET является идемпотентным и всеми).

К моему удивлению, когда я развернул службу в Azure, все ответы были отправлены с заголовком Cache-Control: private или другим заголовком, запрещающим использование кеша.

Я пробовал предлагаемое решение in this question, он работал локально в IIS, но не работал, как только мы развернули Azure. Я не мог найти ничего в документации об этой способности, которая, по моему мнению, была очень простой в службе RESTful, я действительно надеюсь, что мне не хватает чего-то очевидного, в MVC это было очень просто.

Т.Л., др

Мы должны кэшировать GET запросов на стороне клиента при использовании Azure и Web API.

+0

Можете ли вы предоставить дополнительную информацию, например, развертывание на веб-сайте Windows Azure или облачном сервисе? – sabbour

+0

@sabbour Я уверен, что мы работаем как веб-сайт Windows Azure (развернутый с помощью Web Deploy), который мы можем развернуть в зависимости от конфигурации, которая помогает. –

+1

Действительно ли вы устанавливаете какие-либо свойства кеширования вашего HttpWebResponse? Можете ли вы показать пример кода, который точно объясняет, что вы сделали, чтобы попытаться заставить кешировать работу? Вопрос, с которым вы связаны, связан с использованием кэширования вывода ASP.NET, но это целый другой зверь, чем «простое» кэширование HTTP-запросов. –

ответ

5

Я не верю, что Azure делает с вами что-либо в этом отношении. Вам нужно точно указать, какие свойства кеширования вы хотите использовать для своих ресурсов.

С помощью WebAPI вы можете контролировать, какие свойства кеширования имеют ваш ответ через CacheControlHeaderValue, который доступен через свойство myHttpResponseMessage.Headers.CacheControl.

Предполагая, что вы имели действие контроллера вроде этого:

public Foo Get(int id) 
{ 
    Foo myFoo = LoadSomeFooById(id); 

    return myFoo; 
} 

Вам нужно сделать что-то вроде этого, чтобы взять под контроль кэширования явно:

public HttpResponseMessage Get(int id) 
{ 
    Foo myFoo = LoadSomeFooById(id); 

    HttpResponseMessage myHttpResponseMessage = this.Request.CreateResponse(HttpStatusCode.OK, myFoo) 

    CacheControlHeaderValue cacheControlHeaderValue = new CacheControlHeaderValue(); 
    cacheControlHeaderValue.Public = true;  
    cacheControlHeaderValue.MaxAge = TimeSpan.FromMinutes(30); 

    myHttpResponseMessage.Headers.CacheControl = cacheControlHeaderValue; 

    return myHttpResponseMessage; 
} 

Многие другие свойства, связанные с к кешированию, которое вы ожидаете, также доступны в классе CacheControlHeaderValue, это самый простой пример.

Кроме того, помните, что мой пример является чрезвычайно грубой силой/упрощенным, поскольку все поведение/логика кэширования находится прямо в методе действий. Более чистая реализация может состоять в том, чтобы иметь ActionFilterAttribute, который содержит всю логику кэширования на основе настроек атрибутов и применяет ее к HttpResponseMessage. Затем вы можете вернуться к более методу, ориентированному на модельный метод действия, потому что в этом случае вам больше не нужен доступ к HttpResponseMessage на этом уровне. Как обычно, многие способы скинуть кошку, и вы должны определить, какие из них лучше всего подходят для вашего конкретного проблемного домена.

+0

Большое спасибо, где _is_ myHttpResponseMessage? (Например, в контроллере веб-api Get action) –

+2

Если вы ранее не возвращали HttpResponseMessage явно (например, вы возвращали строго типизированный объект домена и позволяли WebAPI обертывать это для вас), вам нужно будет сейчас. Как только вы захотите взять контроль над такими характеристиками HTTP, вам нужно начать работать на этом уровне. Я обновляю пример кода с более явным примером. –

+0

Дрю благодарен за ваш ответ. Это выглядит довольно ужасно (нужно вернуть HttpResponseMessage). Areyou уверен, что нет другого способа попросить мое приложение по умолчанию кешировать запросы GET на стороне клиента? (ActionFilterAttribute - это то, к чему я стремлюсь, но чем я получу преимущество над ASP.NET MVC-контроллером) –

0

Посмотрите на это http://forums.asp.net/post/4939481.aspx, он реализует кеширование как атрибут, который изменяет HTTP-ответ.

Отказ от ответственности: Я не пробовал.

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