2010-12-01 22 views
1

ContextePourquoi la page d'une URL utilise-t-elle la page mise en cache d'une autre URL?

Je suis assez nouveau pour ASP.NET et très nouveau au concept de la mise en cache. J'espère que pour quelqu'un qui sait ce qu'ils font, le problème ici sera évident. En utilisant MCMS 2002, j'ai créé une page template.aspx qui reçoit une chaîne de requête "person_id" et construit les pages en conséquence. Plusieurs départements différents de l'école où je travaille utilisent ce modèle pour afficher les biographies des professeurs. Tout ceci fonctionne correctement.

Le problème

Les problèmes commencent à se produire lorsque je tente la mise en cache de la page. Quand une personne visite person_id = 16175 sur la page d'un département, puis visite la même bio numérique sur une page de département différente, elle charge la page mise en cache au lieu de la reconstruire. Le problème, alors, est qu'il a tous la mauvaise marque de département. Par exemple:

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

C'est la même person_id, mais les URL sont évidemment différentes. Ce serait génial si le modèle reconnaissait les différentes URL et ignorait le cache. Je suppose que le problème réside dans le fait que les deux pages sont construites en utilisant la même page ASPX sur le backend. Voici le bit OutputCache de la page aspx:

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

Je suppose que je fais quelque chose de mal ici. Espérons que ce sera évident pour quelqu'un qui sait ce qu'ils font. Si vous avez besoin de plus d'informations, n'hésitez pas à demander. Merci!

Répondre

5

Vous êtes probablement correct dans votre hypothèse à ce sujet parce qu'ils utilisent le même fichier ASPX, j'ai vécu la même expérience de première main. Pour contourner ce problème, essayez ce qui suit.

Essayez ceci pour votre cache sortie directive

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

puis ajoutez dans votre fichier 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 
} 

Une version de la page sera mise en cache pour chaque valeur unique retournée par la méthode pour un argument donné. Ainsi, en retournant l'URL, vous vous assurez que le cache ne sera pas utilisé pour les différentes URLs

Une chose importante à noter est que si vous n'avez pas un seul fichier physique résolvant plusieurs URL, alors VaryByParam="*" suffirait pour obtenir le comportement souhaité . C'est parce que vous avez ce routage d'URL que vous avez besoin VaryByCustom="url"

+0

Impressionnant! Cela a pris soin des choses, et comme un bonus supplémentaire, j'ai maintenant une bien meilleure compréhension de la façon dont fonctionne VaryByCustom. –

+0

N'est-il pas préférable d'appeler la méthode de base lorsque arg ne correspond pas? 'return base.GetVaryByCustomString (contexte, arg);' –