2017-02-17 3 views
1

Ma mise en cache de sortie ne semble pas fonctionner comme prévu Il s'agit d'une méthode de contrôleur pour retourner la page par défaut pour mon site Web. Je l'ai mis en cache pour 40secs (test -> en direct, il est mis en mémoire cache beaucoup plus longtemps)OutputCache ne fonctionne pas correctement -> ASP.NET MVC5

[OutputCache(Duration = 40, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "none")] 
public async Task<ActionResult> Index(){ 
...... 
} 

J'ai 2 problèmes

Première

Quand je frappe le point final pour la première temps il est mis en cache correctement sur le serveur et renvoie l'en-tête de réponse suivant (comme prévu) entre autres.

status:200 
Cache-Control:"private, max-age=40, s-maxage=0" 

Lorsque j'ouvre un nouvel onglet du navigateur et que je colle le même point final après 5 secondes. il va au serveur et renvoie un 200 avec le contenu et l'en-tête suivant

status:200 
Cache-Control:"private, max-age=63622944145, s-maxage=63622944105" 

Cela ne me semble pas correct. Je m'attendais à envoyer une requête au serveur avec l'en-tête If-modified-since. Si la réponse mise en cache était reconstruite depuis le temps dans l'en-tête, alors elle retournerait un contenu de 200 + sinon un 304. Donc dans ce cas, le cache du serveur n'étant pas reconstruit, il devrait renvoyer un 304. Aussi, l'âge maximum est si grand il est maintenant invalide et est donc immédiatement considéré comme périmé. Alors qu'est-ce que je fais de mal ...?

En second lieu

Je mis un point d'arrêt dans ma méthode d'index et cliquez sur le point final de mon navigateur. La première fois que j'atteins l'extrémité de l'index, le point d'arrêt est atteint. Les demandes suivantes au point de terminaison n'atteignent pas le point d'arrêt pendant les 40 secondes suivantes comme prévu. Toutefois, si j'ajoute un "/" à la fin de mon point de terminaison dans le navigateur, il va frapper le point d'arrêt en ignorant le cache. Comment éviter cela ..?

+0

En ce qui concerne la deuxième partie de votre question, l'URL 'http://www.example.com' et 'http://www.example.com/' , avec le /, sont des pages différentes. Vous aurez besoin d'un module de réécriture d'URL dans Web.Config si vous voulez que les deux soient traités de la même manière. Je vais modifier ma réponse ci-dessous. – kodikas

Répondre

0

Je viens d'avoir ce même problème. Il y a un fil sur github ici (je pense qu'il est un bug): https://github.com/Microsoft/dotnet/issues/330

La solution pour moi était comme suit: (1) Téléchargez et installez le .Net Framework 4.6.2 Pack Dev. Accédez à la page Propriétés de votre projet et sélectionnez-la dans la liste ou accédez à Installer d'autres cadres ... (2) Ciblez votre application sur 4.6.2. Vous devrez redémarrer le projet (il a un message). (3) Aller à web.config et assurez-vous de ces valeurs:

<system.web> 
<compilation targetFramework="4.6.2" /> 
<httpRuntime targetFramework="4.6.2" /> 

(4) Enfin, rendez-vous à l'ensemble NuGet Installer et installer le package suivant (le chercher): Microsoft .AspNet.OutputCache.OutputCacheModuleAsync

Le problème a été résolu pour moi. J'espère que ça aide.

Question 2: Retrait slash

Ajoutez ce code dans le web.config dans la section appropriée:

<system.webServer> 
<rewrite> 
    <rules> 
    <rule name="Remove trailing slash" enabled="true" stopProcessing="true"> 
     <match url="(.*)/$" /> 
     <conditions> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
     </conditions> 
     <action type="Redirect" redirectType="Permanent" url="{R:1}" /> 
    </rule> 
    </rules> 
</rewrite> 
<validation validateIntegratedModeConfiguration="false" />