Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku Play框架似乎正在缓存结果_Heroku_Playframework - Fatal编程技术网

Heroku Play框架似乎正在缓存结果

Heroku Play框架似乎正在缓存结果,heroku,playframework,Heroku,Playframework,我使用的是PlayFramework2.3.8(在2.2.4上也有同样的问题,升级没有帮助) 我没有使用Play Framework的缓存API。但似乎GET结果仍然被Play奇怪地缓存着 例如,如果我点击api GET/api/GetPurchases,我将得到2个结果。Play将记录GetPurchasesapi已命中(我还覆盖Global.java中的onroutereRequest,并将其记录在那里)。然后我将点击api POST/api/CreatePurchase,确认数据库中现在有

我使用的是PlayFramework2.3.8(在2.2.4上也有同样的问题,升级没有帮助)

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

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

我将再次调用GET
/api/GetPurchases
,得到两个结果。日志显示,api
/api/GetPurchases
似乎从未被点击过


此外,只有当我的应用程序部署到Heroku时,才会发生这种情况。在当地,一切都很完美。但我已经与Heroku支持人员进行了交谈,以确保Heroku只是一个平台,他们不会导致Play的行为发生任何变化。

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

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

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

response().setHeader(CACHE_CONTROL, "no-cache");
通过运行
foreman start
在本地模拟生产部署也很有帮助


多亏了Salem和millhouse的上述评论

您在这两种情况下是否以相同的模式运行它们?如果是这样的话,请使用诸如Chrome或Firefox开发工具之类的工具来检查您的游戏发送的HTTP头app@Salem嗨,塞勒姆,我正在测试它,就在我们说话的时候,它的实际表现(仍然很奇怪),但在浏览器中比在我的iOS应用程序中要好一点。在我的浏览器中,至少每次我调用API时,Play都会记录它被命中。但通常它仍然会收到不正确的数据(只是成功发送到iOS应用程序的最后一个数据)。但事实上,这些问题在本地环境中都无法重现,这太奇怪了。@Salem当我查看iOS应用程序结果时,它总是发送一个200 OK响应头。即使播放日志中没有显示API是否成功。此外,我们有一个Android应用程序显示了相同的错误行为,因此更可能是服务器端问题或将当前时间戳作为get参数附加到设备中(例如:
yourserver.com/api/GetPurchases?ts=1425130064
)。我认为Play有一个完全禁用缓存的配置,但这可能不是最好的选择……不要忘记,您可以始终运行
foreman start
,以在本地运行类似于生产的实例。