【发布时间】:2013-10-25 03:25:54
【问题描述】:
在了解 MVC 概念时,我了解到在“GET”操作中包含更改服务器对象状态(数据库更新等)的代码并不是一个好习惯。 “缓存返回数据”已作为原因给出。
有人可以解释一下吗?
提前致谢!
【问题讨论】:
标签: c# asp.net-mvc http-get
在了解 MVC 概念时,我了解到在“GET”操作中包含更改服务器对象状态(数据库更新等)的代码并不是一个好习惯。 “缓存返回数据”已作为原因给出。
有人可以解释一下吗?
提前致谢!
【问题讨论】:
标签: c# asp.net-mvc http-get
这是 HTTP 标准。 GET 动词应该是幂等且安全的。
9.1.1 安全方法
实施者应该意识到软件代表用户 他们在互联网上的互动,并且应该小心允许 用户要知道他们可能采取的任何可能有 对自己或他人有意想不到的意义。
特别是,已经确立了 GET 和 HEAD 方法不应该具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如 POST、PUT 和删除,以一种特殊的方式,让用户知道 正在请求可能不安全的操作。
自然不能保证服务器不 由于执行 GET 请求而产生副作用;在 事实上,一些动态资源认为这是一个特性。重要的 这里的区别是用户没有请求副作用,所以 因此不能对他们负责。
【讨论】:
浏览器可以缓存 GET 请求,通常是在静态数据上,例如图像或脚本。但是您也可以允许浏览器缓存 GET 请求到控制器操作,使用 [OutputCache] 或其他类似方式,因此如果为 GET 控制器操作打开缓存,则单击指向 /Home/Index 的链接可能不会'实际上并没有在服务器上运行Index 方法,而是允许浏览器从自己的缓存中提供页面。
按照这种思路,您可以安全地在 GET 操作上打开缓存,在这些操作中,您所提供的数据不会更改(或不经常更改),并且知道您的服务器操作不会更改每次都开火。
浏览器不会缓存 POST,因此任何 POST 都可以保证到达服务器。
【讨论】:
[OutputCache] 不是客户端缓存。它是服务器端的。其他一切都很有意义。
暂时忽略缓存。另一种思考方式是,搜索引擎将在其索引/抓取过程中存储 HTTP GET 链接,因此它们会出现在搜索结果中。
假设如果您的 /Home/Index 被实现为 GET 但它可以说删除数据库中的一行,每次此链接出现在搜索引擎上并且有人点击它,你会有一个删除行,很快你就会有很多被删除的行。
【讨论】:
HTTP 规范声明 GET 和 HEAD 应该是幂等的,即。他们不应该改变服务器状态。
其中一个实际的方面是,搜索机器人会针对他们知道的指向您网站的任何链接发出 GET。如果这样的 GET 更改了本不应更改的用户数据,那么您就有麻烦了。
具有幂等性的额外好处是客户端可以缓存 GET 的结果(使用 HTTP 标头来控制这一点)。
【讨论】: