【问题标题】:Play Framework seems to be caching GET resultsPlay Framework 似乎正在缓存 GET 结果
【发布时间】:2015-02-28 10:33:15
【问题描述】:

我正在使用 Play Framework 2.3.8(在 2.2.4 上遇到同样的问题,升级没有帮助)。

我没有使用 Play Framework 的缓存 API。但似乎 GET 结果仍然以某种方式被 Play 奇怪地缓存。

例如,如果我点击 api GET /api/GetPurchases,我会得到 2 个结果。 Play 将记录GetPurchases api 已被命中(我还在Global.java 中覆盖OnRouteRequest 并将其记录在那里)。然后我会点击 api POST /api/CreatePurchase 并确认数据库中现在有 3 个购买对象。

我会再次调用 GET /api/GetPurchases,我会得到 2 个结果。并且日志显示 api /api/GetPurchases 好像从未被命中。

另外,这只发生在我的应用部署到 Heroku 时。本地一切正常。但我已经与 Heroku 支持人员进行了交谈,以确保 Heroku 仅适用于平台,并且他们永远不会导致 Play 采取任何不同的行动。

【问题讨论】:

  • 您是否在两种方案中以相同的模式运行它们?如果是这样,请使用 Chrome 或 Firefox 开发人员工具检查 Play 应用发送的 HTTP 标头
  • @Salem 嗨,Salem,我正在测试它,实际上它的行为(仍然很奇怪)但在浏览器中比在我的 iOS 应用程序中要好一些。在我的浏览器中,至少每次我调用 API 时,Play 都会记录它被命中。但通常它仍然会得到不正确的数据(只是成功发送到我的 iOS 应用程序的最后一个数据)。但是,这些问题都不能在本地环境中重现,这一事实是如此奇怪。
  • @Salem 当我查看我的 iOS 应用程序结果时,它总是发送 200 OK 响应标头。即使播放日志没有显示 API 曾经命中。此外,我们有一个 Android 应用显示相同的错误行为,因此这似乎更有可能是服务器端问题。
  • 您可以尝试在控制器中使用response().setHeader("Cache-Control", "no-cache"); 或将设备中的当前时间戳作为获取参数附加(例如:yourserver.com/api/GetPurchases?ts=1425130064)。我认为 Play 有一个配置可以完全禁用缓存,但这可能不是最好的选择...
  • 不要忘记,您始终可以运行 foreman start 以在本地运行类似生产的实例。

标签: heroku playframework


【解决方案1】:

我们最终发现 Play Framework 正在缓存 GET 结果。

我们发现,默认情况下,Play 在开发模式下不会缓存结果(所以在本地部署时)。但是在生产模式下(所以当部署到 Heroku 时),Play 默认会缓存结果。

为了改变这一点,我们在我们不希望 Play 缓存结果的操作方法中添加了这行代码:

response().setHeader(CACHE_CONTROL, "no-cache");

通过运行 foreman start 在本地模拟生产部署也很有帮助。

感谢上面 cmets 的 Salem 和 millhouse

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多