【发布时间】: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