Почему страница с одним URL использует страницу из кэша с другого URL? - PullRequest
1 голос
/ 02 декабря 2010

Фон

Я довольно новичок в ASP.NET и очень плохо знаком с концепцией кэширования.Я надеюсь, что для тех, кто знает, что они делают, проблема здесь будет очевидна.

Используя MCMS 2002, я создал страницу template.aspx, которая получает строку запроса "person_id" и создает страницысоответственно.Несколько разных отделов в школе, где я работаю, используют этот шаблон для отображения биографий факультетов.Это все работает правильно.

Проблема

Проблемы начинаются, когда я пытаюсь кэшировать страницу.Когда человек посещает person_id = 16175 на странице одного отдела, а затем посещает ту же числовую биографию на другой странице отдела, он загружает кэшированную страницу вместо ее восстановления.Таким образом, проблема заключается в том, что у него неправильный фирменный стиль.Например:

http://health.usf.edu/medicine/obgyn/facstaf/profiles.htm?person_id=16175 http://health.usf.edu/medicine/surgery/surgery_bios.html?person_id=16175

Это тот же person_id, но URL-адреса, очевидно, разные.Было бы здорово, если бы шаблон распознавал разные URL и игнорировал кеш.Я предполагаю, что проблема заключается в том, что обе страницы создаются с использованием одной и той же страницы aspx на серверной части.Вот бит OutputCache со страницы aspx:

<%@ OutputCache Duration="86400" Location="Server" VaryByParam="person_id; section" VaryByCustom="CMSPosting" VaryByHeader="Referer" %>

Я предполагаю, что я что-то здесь не так делаю.Надеюсь, это будет очевидно для тех, кто знает, что они делают.Если вам нужна дополнительная информация, не стесняйтесь спрашивать.Спасибо!

1 Ответ

5 голосов
/ 02 декабря 2010

Вы, скорее всего, правы в своем предположении о том, что они используют один и тот же файл ASPX, я испытал то же самое из первых рук. Чтобы обойти эту проблему, попробуйте следующее.

Попробуйте это для своей директивы кэша вывода

<%@ OutputCache Location="Server" VaryByCustom="url" Duration="60" VaryByParam="*" %>

, а затем добавьте это в свой файл Global.asax.

public override string GetVaryByCustomString(HttpContext context,string arg)
{
    if (arg == "url")
    {
         return context.Request.RawUrl;
    }
    return context.Request.RawUrl;//you can vary by other stuff here
}

Версия страницы будет кэшироваться для каждого уникального значения, возвращаемого методом для данного аргумента. Таким образом, возвращая URL-адрес, вы гарантируете, что кеш не будет работать для разных URL-адресов

Ключевым моментом, на который следует обратить внимание, является то, что если у вас нет одного физического файла, разрешающего несколько URL-адресов, тогда VaryByParam="*" будет достаточно для получения желаемого поведения. Это потому, что у вас есть эта маршрутизация URL, что вам нужно VaryByCustom="url"

...