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