Устранение неполадок с кэшированием ASP.Net. Кажется, что свойство CacheDuration не имеет никакого эффекта - PullRequest
5 голосов
/ 20 октября 2010

Я пытаюсь заставить ASP.Net кэшировать ответ на запрос веб-службы, задав свойство CacheDuration атрибута WebMethod:

[WebMethod(CacheDuration = 60)]
[ScriptMethod(UseHttpGet = true)]
public static List<string> GetNames()
{
    return InnerGetNames();
}

Выше приведен метод на странице ASP.Net (я также пытался переместить его в свой собственный класс, но, похоже, это не имело никакого значения) - я установил UseHttpGet в true, потому что POST запросов не кэшируются, однако, несмотря на все мои усилия, похоже, что это не имеет никакого значения (точка останова, помещенная в начале метода, всегда достигает цели).

Это код, который я использую для вызова метода:

%.ajax({
    url: "MyPage.aspx/GetNames",
    contentType: "application/json; charset=utf-8",
    success: function() {
        alert("success");
    }

Что-то, что я пропустил, может мешать ASP.Net кешировать этот метод?

В противном случае, существуют ли какие-либо диагностические механизмы, которые я могу использовать, чтобы более четко понять, что происходит с кэшированием ASP.Net?

Ответы [ 2 ]

6 голосов
/ 21 мая 2011

Согласно этому MSDN How to article , свойство CacheDuration атрибута WebMethod предназначено для XML WebMethods.Поскольку атрибут ScriptMethod указывает на возвращение JSON , вместо этого мы вынуждены использовать кэширование на уровне объекта:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static List<string> GetNames()
{
    var result = GetCache<List<string>>("GetNames");
    if(result == null)
    {
        result = InnerGetNames();
        SetCache("GetNames", result, 60);
    }
    return result;
}

protected static void SetCache<T>(string key, T obj, double duration)
{
    HttpContext.Current.Cache.Insert(key, obj, null, DateTime.Now.AddSeconds(duration), System.Web.Caching.Cache.NoSlidingExpiration);
}

protected static T GetCache<T>(string key) where T : class
{
    return HttpContext.Current.Cache.Get(key) as T;
}
0 голосов
/ 20 октября 2010

Убедитесь, что ваш браузер не отправляет заголовок Cache-control: no-cache со своим запросом. Согласно документации, кэшированные результаты не отправляются, если пользовательский агент указал no-cache.

Основываясь на опубликованном вами вызове .ajax, вы должны быть в порядке, но двойная проверка того, что фактически отправлено на сервер, позволит вам быть уверенным.

Такой инструмент, как fiddler , неоценим для отладки того, что происходит по проводам, для взаимодействия браузера и веб-службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...