Кэшировать веб-сервисы путем передачи аргумента функции

#asp.net #web-services #caching #optimization #webmethod

#asp.net #веб-сервисы #кэширование #оптимизация #веб-метод

Вопрос:

Интересно, как я могу кэшировать возвращаемые веб-сервисом данные по переданному аргументу?

Например:

 [WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string FunctionThatReturnsSomething(int param1){
   ... does something
return strResu<

}
  

Я хочу, чтобы возвращенные веб-сервисом возвращенные данные были кэшированы, но в соответствии со значением параметра (inr param1). Поэтому, если, например, функция веб-сервиса получает значение ‘1’, она будет кэшировать результаты для этого. Если функции получают целое число ‘2’ для параметра 1, он будет кэшировать другой результат.

примечание: веб-метод / веб-сервис вызывается через Ajax-вызов с использованием метода POST.

Ответ №1:

ASP.NET удобно предоставляет кэш приложений только для такого рода вещей.

В простейшей форме вы можете просто добавить данные в кэш следующим образом:

 HttpRuntime.Cache["Key"] = "Value"; 
  

Таким образом, вы можете легко кэшировать данные, которые хотите вернуть:

 string cacheKey = "FunctionThatReturnsSomething_"   param1.ToString();

if (HttpRuntime.Cache[cacheKey] == null)
{
    string myData = GetDataToReturn(param1);

    HttpRuntime.Cache[cacheKey] = myData; 
}

return (string)HttpRuntime.Cache[cacheKey];
  

Это также позволяет вам указать CacheDependency. Так, например, если ваши данные были основаны на локальном файле, вы можете автоматически очистить кэш при обновлении этого файла.

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

 HttpRuntime.Cache.Insert(cacheKey, myData, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0));
  

Или в абсолютное время, например, через 10 минут после его добавления:

 HttpRuntime.Cache.Insert(cacheKey, myData, null, DateTime.Now.AddMinutes(10), 
System.Web.Caching.Cache.NoSlidingExpiration);
  

Комментарии:

1. Я думаю, что атрибут кэша над веб-методом учитывает параметр, но мне нужно быть уверенным на 100%. Я предпочитаю атрибут, потому что он прост в использовании.

2. Ха-ха, да, конечно! Я совершенно забыл, что веб-методы также могут использовать кэширование вывода, как и пользовательские элементы управления и т.д. Это стоит поместить в отдельный ответ. Вы также можете обратиться к HttpResponse.RemoveOutputCacheItem , если вам когда-нибудь понадобится программно аннулировать кеш.