Hierbei geht es um das Application Request Routing und das dynamische Deaktivieren des Festplattencaches für bestimmte Anfragen (wobei die Anfragen von authentifizierten Benutzern stammen; ob sie authentifiziert sind, kann durch benutzerdefinierten Code entschieden werden).
In meinem Setup gibt es einen Server, auf dem ARR ausgeführt wird und der Anfragen an eine ASP.NET MVC-Site auf einem anderen Server sendet. Die Site verwendet Formularauthentifizierung (und manchmal HTTP-Basisauthentifizierung), daher erfolgt die Authentifizierung auf der MVC-Site und nicht in ARR: Grundsätzlich wird bei der Authentifizierung des Benutzers auf der Site ein Formularauthentifizierungs-Cookie erstellt.
Ich möchte, dass in ARR Folgendes passiert:
- Führen Sie eine Ausgabezwischenspeicherung für anonyme Benutzer durch.
- Für authentifizierte Benutzer sollten Sie nur statische Dateien (z. B. CSS-, JS- oder JPG-Dateien) zwischenspeichern, dynamische Seiten jedoch nicht.
Wie ist es möglich, für dieses Szenario eine Cache-Konfigurationsregel festzulegen? Ich habe mehrere Möglichkeiten ausprobiert:
- Cache-Header: Die von der MVC-App gesendeten Cache-Control-Header sind hier nicht verwendbar, denn stellen Sie sich Folgendes vor: Seite 1 befindet sich im Cache von ARR. Der Benutzer authentifiziert sich und besucht Seite 1. Die MVC-App würde einen No-Cache-Header senden, aber die Anfrage erreicht sie nicht, sodass der Benutzer die zwischengespeicherte Version erhält.
- URLs ohne Cache: Ich dachte, dass die Definition, dass URLs mit „no-arr-cache“ nicht zwischengespeichert werden sollten, wahrscheinlich mit URL-Umschreiben funktionieren würde, d. h. mit einem benutzerdefinierten URL-Umschreibeanbieter würde ich authentifizierte Anfragen in …?no-arr-cache umschreiben. Abgesehen davon, dass sich ARR-Cache-Kontrollregeln nicht um Abfragezeichenfolgen kümmern, besteht das Problem darin, dass ARR bei der Auswertung einer Cache-Konfigurationsregel nur die angeforderten URLs berücksichtigt, nicht die umgeschriebene URL.
Vielen Dank im Voraus!
Ich habe dies von derIIS-Forenweil dort niemand geantwortet hat.
Antwort1
So habe ich es gelöst.
Dabei müssen wir folgende Prämissen im Auge behalten:
- ARR identifiziert zwischengespeicherte Elemente anhand ihrer URL (die je nach Konfiguration die Abfragezeichenfolge enthält; dies sollte die Konfiguration sein).
- Während einer Anfrage kann ARR angewiesen werden, die Ausgabe der aktuellen Anfrage nicht zwischenzuspeichern.
- Wenn die Ausgabe der aktuellen Anfrage (URL) zuvor zwischengespeichert wurde, gibt es meines Wissens keine Möglichkeit, ARR anzuweisen, die zwischengespeicherte Version nicht zu verwenden.
Die Grundidee besteht darin, die URL der Anfrage zu ändern oder sie mit IIS URL Rewrite anders umzuschreiben, je nachdem, ob der Benutzer authentifiziert ist oder nicht. Nicht authentifizierten Benutzern werden alle Seiten mit z. B. /my-page?authenticated=false und authentifizierten Benutzern mit /my-page?authenticated=true bereitgestellt. Seiten werden nur für anonyme Benutzer zwischengespeichert, sodass ARR keinen passenden Cacheeintrag für authentifizierte Benutzer findet. Damit ist der dritte Punkt gelöst. Der Nachteil ist, dass die Abfragezeichenfolge, die Sie an die URLs anhängen, im HTML-Text erscheinen kann. Diese sollten mit IIS URL Rewrite entfernt werden.
Um ARR anzuweisen, die aktuelle Anforderung nicht zwischenzuspeichern, setzen Sie die Servervariable ARR_CACHE_CONTROL_OVERRIDE auf „1,no-cache“ (Sie können dies über Umschreibregeln tun).
Ob der Benutzer authentifiziert ist, können Sie über einen IIS URL Rewrite IRewriteProvider feststellen (sieheLernprogramm), d. h. Sie können die Ausgabe eines solchen Anbieters verwenden, um die URL für authentifizierte und anonyme Benutzer unterschiedlich umzuschreiben.
Hoffe, das hilft jemandem.