MVC获得Vs Post

时间:2013-10-16 20:26:48

标签: c# asp.net-mvc http-get

在浏览MVC概念时,我已经读到在“GET”操作中包含代码来改变服务器对象状态(数据库更新等)并不是一个好习惯。 “缓存返回数据”已被作为理由。

有人可以解释一下吗?

提前致谢!

4 个答案:

答案 0 :(得分:6)

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

  

9.1.1安全方法

     

实施者应该知道该软件代表用户   他们在互联网上的互动,应该小心允许   用户要知道他们可能采取的任何行动   对自己或他人意想不到的重要性。

     

特别是,已经建立了GET和GET的惯例   HEAD方法不应该具有采取行动的意义   除了检索。这些方法应该被认为是“安全的”。   这允许用户代理表示其他方法,例如POST,PUT   和DELETE,以一种特殊的方式,使用户了解   事实上,正在要求采取可能不安全的行动。

     

当然,无法确保服务器不能   由于执行GET请求而产生副作用;在   事实上,一些动态资源考虑了一个功能。重要的   区别在于用户没有请求副作用,所以   因此不能对他们负责。

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

具有幂等性还有一个额外的好处,即客户端可以缓存GET的结果(使用HTTP头来控制它)。