2016-03-22 6 views
0

Meine Anwendung soll einige Bilder aus dem internen Dienst ständig herunterladen und hosten. Ich habe das implementiert, indem ich einen Akteur implementiere, der die Bilder abholen soll. Sie stellt die unter /public/analytics ich diese Standardroute gesetzt haben:Play 2 und Caching-Assets

GET  /public/*file  controllers.Assets.at(path="/public", file) 

Aber aus irgendeinem Grund, wenn ich versuche über http://server/public/assets/image.png ein Bild zugreifen zu können, sehe ich nicht das Update. Ich denke, das Problem ist, dass es zwischengespeichert wird. Wenn ich in mein Hosting gehe, sehe ich das aktualisierte Bild in /public/analytics, so dass es im Cache sein sollte.

Ich habe versucht, dies zu Global hinzuzufügen:

override def doFilter(action: EssentialAction): EssentialAction = EssentialAction { request => 
    import play.api.http.HeaderNames 
    action.apply(request).map(_.withHeaders(
     HeaderNames.CACHE_CONTROL -> "no-cache", 
     HeaderNames.PRAGMA -> "no-cache" 
    )) 
    } 

Aber das Ergebnis ist immer noch das gleiche. Außerdem sehe ich no-cache Header, wenn ich die Bild-URL abrufe. Ich habe einen Vorschlag gesehen, jedes Mal eine neue URL zu generieren, aber das kann ich nicht tun.

Irgendwelche Ideen, was möglicherweise falsch sein könnte?

Antwort

0

Sobald Sie den Assets Controller verwenden, you're getting caching, compression, etc support "out of the box" - aber Sie wollen es eigentlich nicht!

Wie Sie entdeckt haben, ist es eine sehr bequeme Möglichkeit, Inhalte aus anderen Quellen zu dienen, so vielleicht der einfachste Weg, um dieses Problem zu lösen, ist das Caching an ihrem Platz zu bleiben, aber geben Sie eine sehr kurze max-age für alles.

Mit Blick auf die source of Assets, sieht es so aus, wenn Sie eine assets.defaultCache angeben, können Sie dies tun; das heißt in Ihrem application.conf:

assets.defaultCache="public, max-age=30" 

, die einen Standard-Achtung-Browser bedeutet, dass nur eine Anlage für 30 Sekunden, bevor er frage nach einem neuen behalten. Sie können dies für eine optimale Effizienz mit dem Zeitraum Ihres geplanten Abrufers vergleichen.

+0

Leider funktioniert das nicht - ich bekomme immer noch das alte Bild, auch wenn ich 30 Sekunden warte. Ich habe versucht, den Cache auszuschalten, sehe den Code, den ich in der Antwort geschrieben habe - und ich bekomme immer noch ein altes Image. Erst als ich den Image-Retrieval über die normale "Action" implementierte, konnte ich reagieren, aber ich bin nicht sicher, ob dieser Ansatz gut ist. – Archeg

+0

Das seltsame Ding, dass ich selbst nach 3 Stunden immer noch das alte Image bekomme. Gibt es noch etwas anderes als Cache, das das verursachen kann? – Archeg