Сохранять кэш вывода webmethod до обновления

У меня есть страница ASP.NET с основанным на таймере скриптом, вызывающим WebMethod на сервере.

Вот скрипт на aspx:

function AutoRefreshPage() {

    $.ajax({
        type: "POST",
        url: pageUrl + "/GetSomeData",
        data: JSON.stringify({ 
        par1: 'a',
        par2: 'b',
        par3: 'c'
        }),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (response) {
            var objMain = $.parseJSON(response.d);

            // Update data on page...

            // Re-trig method in 30 sec
            setTimeout(AutoRefreshPage, 30000);



        }, 
        error: function (XMLHttpRequest, textStatus, errorThrown) {

            console.log("Error");

            // Re-trig method in 30 sec
            setTimeout(AutoRefreshPage, 30000);

        }
    });

}

Вот веб-метод:

namespace MyNameSpace
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ScriptService]
    [System.ComponentModel.ToolboxItem(false)]
    public class AjaxServiceProxy : System.Web.Services.WebService
    {


        [WebMethod(EnableSession = true, CacheDuration = 120)]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetSomeData(string par1, string par2, string par3)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Read from DB (takes abour 10 sec)
            var reply = GetSomeDataFromDB(par1,par2,par3);

            return serializer.Serialize(reply);

        }

    }
}

Предполагается, что кеширование работает так, как положено... При первом вызове GetSomeData удаляется БД, а данные извлекаются и сохраняются в кеше. Любые дальнейшие вызовы (с теми же значениями параметров) возвращают кэшированные данные. Когда время кеширования составляет 120 секунд, кеш очищается и данные снова считываются из БД. Теперь к моей проблеме - когда количество вызывающих клиентов увеличивается (каждый из которых имеет свое обновление на основе таймера), очень вероятно, что есть несколько вызовов GetSomeData ПОСЛЕ того, как кэш истек, но ДО обновления кеша. Результатом будет много обращений к БД - все читают одни и те же данные. И это было то, чего я действительно хотел избежать, используя кэшированный вывод! Есть ли какой-нибудь элегантный способ избежать этого промежутка времени без действительного кэша?

0 ответов

Другие вопросы по тегам