MVC获得Vs Post

在阅读MVC概念时,我已经读到在“GET”操作中使用代码来改变服务器对象的状态(数据库更新等)并不是一个好习惯。 已经给出了“返回数据的缓存”作为原因。

有人可以解释一下吗?

提前致谢!

浏览器可以缓存GET请求,通常是静态数据,如图像或脚本。 但您也可以允许浏览器使用[OutputCache]或其他类似方式将GET请求缓存到控制器操作,因此如果为GET控制器操作启用了缓存,则可能会单击指向/Home/Index的链接实际上并不在服务器上运行Index方法,而是允许浏览器从其自己的缓存中提供页面。

通过这种思路,您可以安全地打开GET操作上的缓存,其中您正在提供的数据不会更改(或不会经常更改),并且知道您的服务器操作不会每次都触发。

浏览器不会缓存POST,因此保证任何POST都可以进入服务器。

这是通过HTTP标准。 GET动词应该是幂等和安全的。

9.1.1安全方法

实现者应该意识到软件代表用户在互联网上的交互,并且应该小心地让用户知道他们可能采取的任何可能对他们自己或他人有意想不到的意义的行为。

特别是,已经建立了这样的惯例:GET和HEAD方法不应该具有采取除检索之外的动作的重要性。 这些方法应该被认为是“安全的”。 这允许用户代理以特殊方式表示其他方法,例如POST,PUT和DELETE,以便使用户意识到正在请求可能不安全的操作。

当然,不可能确保服务器不会因执行GET请求而产生副作用; 实际上,一些动态资源会考虑一个function。 这里的重要区别是用户没有请求副作用,因此不能对他们负责。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

暂时忽略缓存。 另一种思考方式是搜索引擎将在索引/抓取过程中存储HTTP GET链接,因此它们将显示在搜索结果中。

假设您的/ Home / Index实现为GET,但可以说删除数据库中的一行,每次此链接显示在搜索引擎上并且有人点击它时,您将有一个删除行,很快就会有很多删除的行。

HTTP规范声明GET和HEAD应该是幂等的,即。 他们不应该改变服务器状态。

一个实际的方面是,搜索机器人将针对他们所知道的任何链接发出GET。 如果这样的GET更改用户数据并不意味着更改,那么您就遇到了麻烦。

作为幂等元素具有额外的好处,客户端可以能够缓存GET的结果(使用HTTP头来控制它)。