【问题标题】:Best practice for indicating a client side refresh/warning from server side从服务器端指示客户端刷新/警告的最佳实践
【发布时间】:2015-08-28 19:19:18
【问题描述】:

我们使用标准的 Rails 服务器,并且在每个版本中,我们的 application.js 版本都会根据需要自动更改

如果有新的部署,则标准刷新页面将获取所需的文件。到目前为止没有问题。

现在,我们有一个仪表板,它有一个刷新按钮,它触发一个 ajax 请求(统计数据/数据)并刷新页面的一部分。无需重新加载页面。但是发生的情况是有时客户端不会在一天中重新加载页面,在此期间,我们部署了以不同方式使用数据的最新代码,以及 ajax 请求(统计数据/数据)虽然仍然是有效的 url ,现在页面上出现了一个奇怪的错误,因为该代码已过时并且数据的使用方式不同。

此类问题的标准解决方案是什么?

a) 想知道我们是否可以在每次部署后使用套接字通知客户端需要重新加载页面等

b) 我们可以通过某种方式使用 http 缓存(无验证等)来通知用户请求不再有效,他们需要重新加载页面。

*甚至不确定它是做什么的,它会起作用。在我们的 ajax 请求中,它甚至没有进入 if 块。

application_controller.rb

before_filter :set_cache_buster

  def set_cache_buster
    if request.xhr?
      response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
      response.headers["Pragma"] = "no-cache"
      response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
    end
  end

欢迎提出任何建议......当我不得不告诉我的客户时,看起来真的很糟糕,嘿,请刷新页面,之后它会起作用。如果我们做错了什么,请告诉我。

【问题讨论】:

  • 让ajax请求返回一个版本号,如果页面加载时与html返回的版本号不匹配,则导致页面刷新。
  • @KevinB - 这是标准方式吗?我以为会有一些非常简单的事情我完全没有注意到
  • 我不知道这样做的“标准方式”,我倾向于避免盲目地遵循别人认为的“标准”。
  • 事实上,您需要某种方式来通知客户它已过时。有很多方法可以做到这一点,您只需要决定哪一种最适合您的情况。
  • @KevinB - 但是你们不要面对这个问题......以角度为例......我有一个使用最新代码的创建过程,我添加了另一个字段。服务器 api 现在需要这个字段,否则它会给出错误.....客户端点击服务器,尽管在 UI 上成功验证(因为他没有刷新页面)浏览器返回这个字段没有不存在错误....我在主要网站上看不到这种情况,所以想知道我哪里出错了。

标签: ruby-on-rails ajax sockets caching http-headers


【解决方案1】:

底线是您必须以一种或另一种方式通知客户它需要刷新。您可以通过 ajax 请求发送的标头、ajax 请求发送的标志、websockets 等来做到这一点,但它必须来自某个地方。

另一种方法是让您的客户端或服务器始终向后兼容。我更喜欢这个选项,因为它对客户端的影响最小,但是,当这不可行时,如果我还没有为该 api 设置 websocket 服务器,我会使用 websockets 或 ajax 请求标头。

websocket解决方案示例流程:

  1. 客户端连接到现有服务器,连接后会收到包含版本号的消息。
  2. 新代码部署到服务器,导致重新启动。
  3. 重新启动会导致客户端断开连接并重新连接。
  4. 重新连接时,客户端会再次收到版本号,如果版本号足够不同则重新启动*。

* 我的意思是,例如,1.0.0 到 1.0.1 不需要重新启动,但 1.0.0 到 1.1.0 需要重新启动

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2020-08-15
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2013-02-25
    • 2015-05-30
    相关资源
    最近更新 更多