在这种情况下我应该使用“post / redirect / get”模式吗?

时间:2011-04-08 11:12:35

标签: webforms post-redirect-get

在我们的网络应用程序中,我允许用户使用简单的单页表单(类似于SO中的配置文件)编辑其配置文件。

我正在尝试决定在这种情况下是否使用“post / redirect / get”模式。

  • 一方面,在更新之后,用户可以刷新个人资料页面(或使用后退按钮导航到它),而不会有任何恼人的浏览器消息询问他们是否希望重新提交他们的数据。

  • 另一方面,此模式需要来自浏览器的第二个请求,并且还要求服务器两次获取配置文件实体(一次更新它,然后再次在重定向上显示它)。

  • 如果我们实现某种类型的数据库复制,则还有一个问题是第二个请求可能会转到另一个服务器,该服务器可能没有收到对配置文件实体的更新。使用Memcache或类似的策略可以解决这个问题,但它增加了更多的复杂性。

  • “post / redirect / get”也会使显示确认消息(“您的个人资料更改已保存”)变得复杂,因为我们现在需要存储一个标志,提示消息显示在第二个请求。理想情况下,我们希望尽可能将应用程序保持为RESTful。

解决此问题的最佳方法是什么?我还有其他任何考虑因素吗?

1 个答案:

答案 0 :(得分:4)

始终使用Post-Redirect-Get。周期。

  

另一方面,此模式需要来自浏览器的第二个请求,并且还要求服务器两次获取配置文件实体(一次更新它,然后再次在重定向上显示它)。

难以衡量。

  

如果我们实现某种类型的数据库复制......

然后不要。

你很少需要这个。很少。几乎所有Web事务中的瓶颈都是从Apache下载到桌面。您的应用程序和数据库不是瓶颈。

证明数据库确实是事务中最慢的部分之前,请不要使用数据库复制。

  

“发布/重定向/获取”也会使显示确认消息变得复杂(“您的个人资料更改已保存”)

这不是“旗帜”。它实际上是一组未显示的消息。您的HTML界面涉及会话,而消息队列是会话对象的一项功能。 HTML并不完全是RESTful,因为 - 好吧 - 人们期待会话。

纯REST版本在第一个GET中没有确认消息。