【问题标题】:MVC Get Vs PostMVC 获取与发布
【发布时间】:2013-10-25 03:25:54
【问题描述】:

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

有人可以解释一下吗?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    9.1.1 安全方法

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

    特别是,已经确立了 GET 和 HEAD 方法不应该具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如 POST、PUT 和删除,以一种特殊的方式,让用户知道 正在请求可能不安全的操作。

    自然不能保证服务器不 由于执行 GET 请求而产生副作用;在 事实上,一些动态资源认为这是一个特性。重要的 这里的区别是用户没有请求副作用,所以 因此不能对他们负责。

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

    【讨论】:

    • 是的,在这种情况下这是一个更好的解释。已编辑。
    • 啊!我希望那家伙没有删除他的评论。我从中学到了一些东西。幂等 != 安全,至少在标准中是这样。
    • 感谢斯图尔特的详细信息!
    【解决方案2】:

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

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

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

    【讨论】:

    • 一件事:[OutputCache] 不是客户端缓存。它是服务器端的。其他一切都很有意义。
    • @StuartBranham 实际上两者都是(至少默认情况下)。在打开 OutputCache 时查看缓存控制和相关标头,您还可以查看网络选项卡的行为 - 使用 OutputCache 时,您将在没有请求的情况下从缓存加载页面,或者 304-未修改如果你刷新结果。如果没有 OutputCache,每个请求都会到达服务器。
    • 一个问题。可能是一个基本的。 MVC 如何知道缓存的数据是否已过时,它实际上应该调用服务器以从 DB 获取更新的数据?
    • 你说的是浏览器,而不是 MVC。但这就是缓存控制器操作(或缓存任何东西)的问题。当服务器第一次发送页面时,它会给出一个过期日期。从浏览器的角度来看,在此之前它可以使用该缓存页面。除非您在浏览器上按“F5”,或者将随机查询字符串值附加到 URL,否则浏览器无法知道您想要一个全新的副本。我想说不要打开缓存,除非您知道您的数据在缓存过期之前不会过时,或者除非您有在需要时附加随机查询字符串值的策略。
    • 非常感谢您的澄清! :)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      其中一个实际的方面是,搜索机器人会针对他们知道的指向您网站的任何链接发出 GET。如果这样的 GET 更改了本不应更改的用户数据,那么您就有麻烦了。

      具有幂等性的额外好处是客户端可以缓存 GET 的结果(使用 HTTP 标头来控制这一点)。

      【讨论】:

        猜你喜欢
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        相关资源
        最近更新 更多